为什么不jQuery 1.3.3。 live()支持所有事件?

时间:2009-08-12 15:50:33

标签: javascript jquery events

我一直在思考jQuery live()事件绑定器,这似乎是一个非常有用的功能。

http://docs.jquery.com/Events/live

我注意到的一件事是它不支持所有事件:

  

目前不支持:模糊,焦点,   mouseenter,mouseleave,change,submit“

我的(非常简单)头脑的理由当然,如果它是针对一个事件实施的,那么对所有其他事件来说这很容易吗?

显然它不是那么简单,所以我想知道是否有人知道为什么这么难为其他所有人做这件事?

2 个答案:

答案 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 的位置,然后再将其冒泡到documentlive()函数只存储您提供的查询字符串,并将其与所有单击的(或mousemove d等)元素进行比较,并在遇到命中时触发您的函数。

其他人:blurfocusmouseentermouseleavechangesubmit都是不会冒泡的事件,因此它们不能与live()一起使用。

他们为什么不泡?

因为如果你考虑一下,那就没有意义了。如果您关注一个元素,那么您只关注一个元素,而不是它的父元素和祖先元素。与其他人类似 - 事件永远不会到达文档,因此您无法使用此技术。

  

*:与计算中的许多“树”隐喻一样,“up”和“top”之类的术语可能有点令人困惑。尽管您的链接在顶部以可视方式呈现,但将其视为底部可能更有帮助。事件通过父母向上冒泡,并达到顶级元素,即“根”。 :-/