更新:从jQuery 1.4开始,$.live()
现在支持 focusin 和焦点事件。
jQuery目前 1 不支持“模糊”或“焦点”作为$.live()方法的参数。我可以实现什么类型的解决方案来实现以下目标:
$("textarea")
.live("focus", function() { foo = "bar"; })
.live("blur", function() { foo = "fizz"; });
的 1 即可。 07/29/2009,版本1.3.2
答案 0 :(得分:31)
工作解决方案:
(function(){
var special = jQuery.event.special,
uid1 = 'D' + (+new Date()),
uid2 = 'D' + (+new Date() + 1);
jQuery.event.special.focus = {
setup: function() {
var _self = this,
handler = function(e) {
e = jQuery.event.fix(e);
e.type = 'focus';
if (_self === document) {
jQuery.event.handle.call(_self, e);
}
};
jQuery(this).data(uid1, handler);
if (_self === document) {
/* Must be live() */
if (_self.addEventListener) {
_self.addEventListener('focus', handler, true);
} else {
_self.attachEvent('onfocusin', handler);
}
} else {
return false;
}
},
teardown: function() {
var handler = jQuery(this).data(uid1);
if (this === document) {
if (this.removeEventListener) {
this.removeEventListener('focus', handler, true);
} else {
this.detachEvent('onfocusin', handler);
}
}
}
};
jQuery.event.special.blur = {
setup: function() {
var _self = this,
handler = function(e) {
e = jQuery.event.fix(e);
e.type = 'blur';
if (_self === document) {
jQuery.event.handle.call(_self, e);
}
};
jQuery(this).data(uid2, handler);
if (_self === document) {
/* Must be live() */
if (_self.addEventListener) {
_self.addEventListener('blur', handler, true);
} else {
_self.attachEvent('onfocusout', handler);
}
} else {
return false;
}
},
teardown: function() {
var handler = jQuery(this).data(uid2);
if (this === document) {
if (this.removeEventListener) {
this.removeEventListener('blur', handler, true);
} else {
this.detachEvent('onfocusout', handler);
}
}
}
};
})();
在IE / FF / Chrome中测试过。应该按照你的预期工作。
更新:拆解现在正在工作。
答案 1 :(得分:5)
此功能现在包含在jQuery核心中(从1.4.1开始)。
答案 2 :(得分:2)
live()
是jQuery的event delegation快捷方式。要回答您的问题,请参阅Delegating the focus and blur events。
这非常巧妙:对于符合标准的浏览器,他使用event capturing来捕获这些事件。对于IE,他使用IE的专有focusin
(针对focus
)和focusout
(针对blur
)事件,这些事件会冒泡,允许传统的事件委派。
我将把它移植到jQuery作为练习。
答案 3 :(得分:2)
它们已被添加到jquery 1.4.1 ...现在.live()函数支持fucus和模糊事件=)问候
答案 4 :(得分:2)
看起来问题是在检查event.type时返回“focusin”& “事件的内容”
$('input').live("focus blur", function(event){
if (event.type == "focusin") {
console.log(event.type);
}else{
console.log(event.type);
}
});
答案 5 :(得分:0)
另外一个补充:此解决方案不支持多个参数。
我试过了:
$(el).live("focus blur", function(e) {
if (e.type == "focus") {
等
它只触发了模糊事件。
然而,这个解决方案很有帮助。