jQuery 的live()方法不起作用,因为焦点和模糊事件不像其他 DOM 事件那样传播(冒泡)。jQuery 团队最终会引入这个功能,但它必须是人工的(手动冒泡)。
如果我不使用 jQuery 并且仍然希望获得以下好处,live()我会在支持它的浏览器(大多数非 IE 浏览器)中使用事件捕获,而在 IE 中我会使用它们的onFocusIn/onFocusOut事件(这些事件与焦点/模糊不同,会冒泡)。
这是一个例子:
function onFocus(el, fn) {
var outerFn = function(e) {
e = e || window.event;
if ((e.target || e.srcElement) === el) {
fn.call(el);
}
};
if (document.body.addEventListener) {
// This is event capturing:
document.body.addEventListener('focus', outerFn, true);
} else {
// This is event delegation:
document.body.attachEvent('onfocusin', outerFn);
}
return outerFn;
}
使用它:
onFocus(document.getElementById('myInputField'), function(){
log('FOCUSED!!!');
});
类似的抽象可用于模糊和更改事件。
在此处阅读有关事件顺序(捕获/冒泡)的更多信息:http ://www.quirksmode.org/js/events_order.html
还可能值得注意的是,jQuery 插件 liveQuery 之所以有效,是因为它将事件重新绑定到新元素;它仅适用于 jQuery 的 DOM 操作方法,例如“append”、“insertBefore”等。因此,如果您要在不使用 jQuery 的情况下添加新元素,它将无法正常工作。