是否应该将所有jQuery事件绑定到$(Document)?
这是从哪里来的
当我第一次学习jQuery时,我通常会附加这样的事件:
$('.my-widget a').click(function() {
$(this).toggleClass('active');});
在了解了更多关于选择器速度和事件委派的信息之后,我在几个地方读到了“jQuery事件委托将使您的代码更快”。所以我开始写这样的代码:
$('.my-widget').on('click','a',function() {
$(this).toggleClass('active');});
这也是复制被弃用的.live()事件的行为的推荐方法。这对我来说很重要,因为我的很多站点总是动态地添加/删除小部件。不过,上面的行为并不完全像.live(),因为只有添加到已有容器‘.my-widget’中的元素才会得到行为。如果在代码运行后动态添加另一个html块,这些元素将不会得到绑定到它们的事件。就像这样:
setTimeout(function() {
$('body').append('<div class="my-widget"><a>Click does nothing</a></div>');}, 1000);
我想达到的目标是:
- .live()/的旧行为意味着将事件附加到尚未存在的元素
- .on()的好处
- 绑定事件的最快性能
- 管理事件的简单方法
现附上以下所有事件:
$(document).on('click.my-widget-namespace', '.my-widget a', function() {
$(this).toggleClass('active');});
似乎满足了我所有的目标。(是的,由于某种原因,IE的速度比较慢,不知道为什么?)它的速度很快,因为只有单个事件被绑定到一个单数元素,而次要选择器只有在事件发生时才会被评估(如果这里出错,请更正我)。命名空间很棒,因为它使切换事件侦听器变得更容易。
我的解决办法/问题
因此,我开始认为jQuery事件应该始终绑定到$(文档)。
你有什么理由不想这么做吗?
这是否可以被视为最佳做法?如果没有,为什么?
如果你读过这篇文章,谢谢。我感谢任何/所有的反馈/见解。
假设:
- 使用支持
.on()
/至少1.7版 - 您希望将事件添加到动态添加的内容中。
阅读资料/例子:
http:/24 ways.org/2011/you-jQuery-Now-with-less
http:/brandonaaron.net/blog/2010/03/4/Event-委托-with-jQuery
http:/www.jason想克博爱网/游乐场/航速/速.html
http://api.jquery.com/on/