我一直在思考jQuery live()
事件绑定器,这似乎是一个非常有用的功能。
http://docs.jquery.com/Events/live
我注意到的一件事是它不支持所有事件:
“目前不支持:模糊,焦点, mouseenter,mouseleave,change,submit“
我的(非常简单)头脑的理由当然,如果它是针对一个事件实施的,那么对所有其他事件来说这很容易吗?
显然它不是那么简单,所以我想知道是否有人知道为什么这么难为其他所有人做这件事?
答案 0 :(得分:10)
这是因为它使用了事件委托。问题是基于事件冒泡的事件委托。并且事件不是为了所有事件而冒泡 你可以在这里阅读更多内容:JavaScript Event Delegation is Easier than You Think
答案 1 :(得分:1)
据我所知:
当您使用live()
时,事件处理程序会附加到document
。
<强>为什么吗
鉴于此片段:
<html>
<body>
<ul>
<li><a href="#">my link</a></li>
</ul>
</body>
</html>
当您在<a>
标记上点击或移动鼠标时,您必须记住,<a>
位于<li>
内的<ul>
内位于<body>
内的<html>
中的document
。无论您使用什么HTML结构,每个元素都存在于document
。
因此,当您单击该链接时,您实际上也会点击所有其他元素,只是该链接位于该堆栈的顶部*
。这称为 bubbling - 点击事件在链接上开始,并通过其每个父母最终到达document
。只要您点击任何元素,您也会点击document
。
因此,如果您在document
上放置一个事件监听器来处理点击次数,它可以检查在同一事件中点击 else 的位置,然后再将其冒泡到document
。 live()
函数只存储您提供的查询字符串,并将其与所有单击的(或mousemove
d等)元素进行比较,并在遇到命中时触发您的函数。
其他人:blur
,focus
,mouseenter
,mouseleave
,change
,submit
都是不会冒泡的事件,因此它们不能与live()
一起使用。
他们为什么不泡?
因为如果你考虑一下,那就没有意义了。如果您关注一个元素,那么您只关注一个元素,而不是它的父元素和祖先元素。与其他人类似 - 事件永远不会到达文档,因此您无法使用此技术。
*
:与计算中的许多“树”隐喻一样,“up”和“top”之类的术语可能有点令人困惑。尽管您的链接在顶部以可视方式呈现,但将其视为底部可能更有帮助。事件通过父母向上冒泡,并达到顶级元素,即“根”。:-/