需求:
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;
查看各种浏览器以及版本信息
<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script type="text/javascript">
$(function(){
if($.browser.msie&&($.browser.version == "6.0")){
alert("<img src='browser/IE.png'>This is MS IE "+$.browser.version);
}
else if($.browser.msie&&($.browser.version == "7.0")){
alert("<img src='browser/IE.png'>This is MS IE "+$.browser.version);
}
else if($.browser.msie&&($.browser.version == "8.0")){
alert("This is MS IE "+$.browser.version);
}
else if($.browser.msie&&($.browser.version == "9.0")){
$("#browser").html("This is MS IE "+$.browser.version);
}
else if($.browser.safari){
$("#browser").html("<This is safari!");
}
else if($.browser.webkit){
$("#browser").html("This is chrome!");
}
else if($.browser.mozilla){
$("#browser").html("This is firefox!");
}
else if($.browser.opera){
$("#browser").html("This is opera");
}
else{$("#browser").html("i don't konw!");}
})
</script>
setInterval:按照指定的周期(毫秒单位)来调用函数或计算表达式。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。
setInterval("action()", 5000);
setTimeout:指定的毫秒数后调用函数或计算表达式。setTimeout() 只执行 code 一次。如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout()。
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。