在本网站现在大多数人可能知道:为什么不把Javascript事件委托给极端?
$("#someTable TD.foo").click(function(){
$(e.target).doSomething();
});
想要进行更糟糕的比:
$("#someTable").click(function(){
if (!$(e.target).is("TD.foo")) return;
$(e.target).doSomething();
});
现在如何,当然差很多将取决于你有多少次达阵表有,但是这个一般原则应该适用,只要你至少有几个TD。 (注意:当然,聪明的事情是使用jQuery代表而不是上面的代码,但我只是想用一个明显的区别来做一个例子)。
无论如何,我向同事解释了这个原则,他们的回答是:“对于站点范围的组件(例如,日期选择INPUT),为什么要停下来呢?为什么不为每种类型绑定一个处理程序的组件给BODY本身?“我没有一个好的答案。
很明显,使用委托策略意味着重新思考如何阻止事件,所以这是一个缺点。此外,假设您可能有一个页面,您有一个“TD.foo”,不应该有一个事件挂钩它。但是,如果你了解并愿意解决事件冒泡的变化,并且如果你强制执行“如果你在TD上放置.foo,它总会让事件挂钩”的策略,这两者似乎都不是大不了。
我觉得我必须错过一些东西,所以我的问题是:是否有任何其他缺点只是将所有站点范围组件的所有事件委托给BODY(而不是将它们直接绑定到涉及的HTML元素,或将它们委托给非BODY父元素)?
我相信这是偏好的问题和案件逐案情况。我的意思是,你应该首先编写代码以尽可能可读。这样,您或其他人就可以在后面进入并检查代码,并且可以轻松使用它。完成之后,您可以检查代码是否运行良好,并根据需要进行优化。在你的特定场景中,$(“someTable TD.foo”)比返回它的场景更容易阅读,管理和关注。有人可能会读取其他代码并对其进行曲解,导致他们在更改时引入错误。只是我的意见 – evasilchenko 2012-03-14 22:27:17
我完全同意:开发人员应该先设计,而不必担心优化问题,只能在适当的时候进行优化。然而,这整个事情是出于现实需要,以优化现有设计(我们有一个伟大的页面,直到我们的客户决定使用它成千上万的行),所以我们试图提出最好的策略来处理这种优化。 – machineghost 2012-03-15 21:21:26
可能重复的[应该所有的jQuery事件绑定到$(文档)?](http://stackoverflow.com/q/12824549/1048572) – Bergi 2014-12-11 02:03:48