live不是万能的

众所周知,jQuery 1.3版中有个很重要的功能是新增了live方法,这个方法可以为现在以及将来出现在页面上的元素绑定事件。
而这个live方法的原理是什么呢?

根据官网上live的文档上找到了这样一个地址
进去一看才知道,所谓神乎其神的方法,其实就是事件冒泡+e.target
跟我先前关于事件重复绑定的文章中的方案二如出一辙。进一步求证,查看jQuery源码,可以在2854行发现如下代码

jQuery(document).bind( liveConvert(type, this.selector),
this.selector, proxy );

这下就明白了,原来live其实就是给document绑定了事件处理函数,这样所有新增的元素的事件都能够冒泡到document上,实现了事件的动态委派的过程。这样极大得简化了本来需要自己管理的冒泡+e.target代码,都交由jQuery来管理了。

但这却会有一定的局限性:e.stopPropagation,对,聪明的你一定想到了,就是这个方法会失效。即使是普通的click的事件,想不让他冒泡都是不可能的。因为事件处理函数就是等事件冒泡到document上之后才触发的,此时再阻止冒泡已经为时已晚。所以,当遇到此类事情的时候,各位同学没办法……只能重复绑定或者用clone(true)咯……
live虽好,但不能乱用,视情况而定才是王道。

不过,幸运的是,e.preventDefault依然可以使用。所以可以说,在事件处理函数中,return false并没有完全废掉。

《live不是万能的》有3个想法

  1. 补充下,
    return false 其实做了两件事情,e.stopPropagation;e.preventDefault
    因此所谓的“return false并没有完全废掉”,只是因为 e.preventDefault 还是有效的,但不能说 return false 起到了完全的效果。

发表评论