如何在jQuery中制作实时自定义事件

jQuery有一个非常方便的事件绑定器,名为live(),它将动态地向DOM元素添加事件(即使是稍后将添加到DOM的元素)。 问题是它只适用于特定事件( 在文档中列出 )。

我真的希望现在有直播,模糊和变化的直播活动。 此外,如果我可以制作实时自定义事件,它将成为我的应用程序的重大改变。 我现在拥有的大部分代码都专门用于重新绑定旧事件(更改,焦点和自定义事件以使项目可拖动或可resize)到通过ajax添加的新dom元素。

任何的想法? 我想事件授权是要走的路,但我现在它会使代码更复杂。 也许是一个处理事件代理的插件……不确定。 帮我找到解决方案。

此function现在可在jQuery 1.4中使用。 live()现在支持所有JavaScript事件(包括自定义事件),并且focusinfocusout事件已作为focusblur冒泡版本引入。

从.live()的jQuery 1.4文档 :

从jQuery 1.4开始,.live()方法支持自定义事件以及所有JavaScript事件。 两个例外:由于焦点和模糊实际上不是冒泡事件,我们需要使用focusin和focusout。

如果它不在jQuery中,那很有可能是一个原因。 浏览器错误等使其不可靠。 我会等到他们实现它或尝试使用原来的插件http://docs.jquery.com/Plugins/livequery

编辑:

不错的downvote家伙。 有一个原因,它不在jQuery中,我高度怀疑它是因为它们是懒惰的 。 我实际上花时间阅读源代码并寻找为什么只有某些事件在live()中实现,我找不到原因。 所以,如果有人知道……请启发我们。

jQuery的live()方法不起作用,因为焦点和模糊事件不像其他DOM事件那样传播(冒泡)。 jQuery团队最终会引入这个function,但它必须是人为的(手动冒泡)。

如果我没有使用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的情况下添加一个新元素,它就行不通。

你可能想看看Ariel Flesley的jQuery.Listen插件。 它类似于live()事件和livequery()插件,但它支持focus()和blur()事件。

http://flesler.blogspot.com/2007/10/jquerylisten.html

我已成功使用livequery插件作为jQuery中.live()函数的补充。 它不仅可以绑定焦点,模糊和更改等事件(live()还不支持,从1.3.2开始),它还提供了一种机制,可以动态地将自定义事件绑定到DOM元素。 例如,我用它将draggable和droppable绑定到一些将通过Ajax添加的DOM元素。 它使我的代码更易于阅读和更易于维护。