到目前为止,本网站上的大多数人可能都知道:
$("#someTable TD.foo").click(function(){
$(e.target).doSomething();
});
将比以下表现差得多:
$("#someTable").click(function(){
if (!$(e.target).is("TD.foo")) return;
$(e.target).doSomething();
});
现在有多糟糕当然取决于你的表有多少个 TD,但只要你至少有几个 TD,这个一般原则就应该适用。(注意:当然,聪明的做法是使用 jQuery 委托而不是上面的,但我只是想举一个有明显区别的例子)。
无论如何,我向一位同事解释了这个原则,他们的回答是“好吧,对于站点范围的组件(例如日期选择输入),为什么要停在那里?为什么不为每种类型的组件绑定一个处理程序到身体本身?” 我没有很好的答案。
显然,使用委托策略意味着重新思考如何阻止事件,所以这是一个缺点。此外,假设您可能有一个页面,其中有一个“TD.foo”,它不应该有一个事件与之相关联。但是,如果您理解并愿意解决事件冒泡更改,并且如果您执行“如果您将 .foo 放在 TD 上,它总是会连接事件”的策略,那么这些似乎都不是大不了。
我觉得我一定遗漏了一些东西,所以我的问题是:将所有站点范围内的所有组件的所有事件委托给 BODY(而不是将它们直接绑定到所涉及的 HTML 元素,或者将它们委托给它们)还有其他不利之处吗?到非 BODY 父元素)?