需求:
input控件在失去焦点后直接做验证,验证通不过的话,显示相应错误。但是如果失去焦点后点击的下个控件是比较特殊的控件(比如,退出系统),那么不执行验证操作,直接退出系统(防止在系统退出前,还显示验证通不过的错误)。
方法1: 通过下述代码在input的onblur事件中取得当前正在活跃(被点击)的控件,然后根据业务来排除特殊控件()。经测试,本方法适用IE8,在Firefox13、Chrome20测试通不过(target取得的一直是body)。
参考:document.activeElement returns [body] from blur event when focus is changing.
在Firefox下,onfocus事件触发时,document.activeElement取得的是预期的控件,但是在onblur事件触发时,document.activeElement取得的是body,而不是下个获得焦点的控件,官网的解释是,在onblur事件触发时,下个被点击的控件还没有获得焦点,只有在onblur事件触发后,下个控件才得到焦点,因此onblur触发时,document.activeElement返回body。
// sample1
var target = event.explicitOriginalTarget || document.activeElement;
alert(target.outerHTML); // sample2
$("#textID").click(function(){
var act = document.activeElement.id;
if(act == "textID" ){
alert("true");
}else{
alert("false");
}
} );
使用jquery获取具有焦点控件的ID: var act = $(document.activeElement).attr("id");
方法2:延迟验证(纯Javascript,适用所有浏览器)
由于onblur后特殊控件的点击事件 一定 发生在input控件的onblur事件以后,因此,在onblur事件中是无法直接得到将来的状态:特殊控件是否被点击了
可以通过把onblur要做的验证操作做一小段时间的后移,然后在做真正验证操作之前,检查特殊控件时候被点击,如果没有,继续验证,否则不做验证操作。
specialClicked = false,
specialClickEvent: function(){
specialClicked = true;
// 特殊事件的操作
}, onblurEvent: function(event){
// 适用所有浏览器,延迟100ms
setTimeout(function(){onblurEventDelay();}, 100);
},
onblurEventDelay: function(event){
if (!specialClicked) {
// 这里做真正的验证操作
}
},
方法3:jquery 1.6后增加了:focus选择器 Firefox浏览器下,onfocus事件取到的是自己,onblur取到的是空
参考::focus selector
查看当前使用的是哪个版本的jQuery
// Returns string Ex: "1.3.1"
$().jquery; // Also returns string Ex: "1.3.1"
jQuery.fn.jquery;
查看各种浏览器以及版本信息
setTimeout(action, 5000)
setTimeout("action()", 5000)
function action () {
// do something
setTimeout(action, 5000);
}
带参数方法使用setTimeout要注意,setTimeout("函数名("+参数+")",毫秒数),这里的参数只能是字符串形式的,而不能传递一个对象。如果要传递对象,可以参考如下代码:
<script language="javascript">
var __sto = setTimeout;
window.setTimeout = function(callback, timeout, param) {
var args = Array.prototype.slice.call(arguments, 2);
var _cb = function() {
callback.apply(null, args);
} __sto(_cb, timeout); }
//测试代码
function shihuan(a) {
alert(a);
}
function yushibo(a, b, c) {
alert(a + b + c);
}
var a = new Object();
window.setTimeout(shihuan, 1000, a);
window.setTimeout(yushibo, 2000, a, 6, 7); // 此例中,setTimeout用法,setTimeout(回调函数, 时间, 参数1, ..., 参数n)。
</script>
用setTimeout实现的每隔固定时间循环执行回调函数,和setInterval的区别:setInterval简单地按照设定的时间间隔回调函数,而setTimeout的时间间隔是设定的时间 + 函数执行消耗的时间。如果要求在每隔一个固定的时间间隔后就精确地执行某动作,那么最好使用setInterval,而如果不想由于连续调用产生互相干扰的问题,尤其是每次函数的调用需要繁重的计算以及很长的处理时间,那么最好使用setTimeout。
原文地址:onblur后下一个获取焦点的控件判断、html当前活跃控件、jquery版本查看、jquery查看浏览器版本、setTimeout&setInterval