【发布时间】:2014-12-30 00:12:23
【问题描述】:
在这种情况下,当使用事件侦听器(为此使用 jQuery)时,我对性能方面的最佳选择是什么感到困惑。
案例 1: 假设您有一个包含两个输入的 div,并且您想为 keyUp 事件“监听”这两个输入。 (这个div是文档中唯一的东西,它的高度和宽度也是整个文档的高度和宽度)
<div id=formContainer>
<input type="text" id="a">
<input type="text" id="b">
</div>
什么会更好? : 将“委托事件侦听器”附加到 formContainer 或将事件侦听器附加到每个输入?
案例 2: 现在,假设你有一个像这样的 html 结构(同样,chatContainer 是文档的全高和全宽,它和它的子级是唯一的东西)
<div id=chatContainer>
<div id="menu"></div> //Has to listen to clicks for interactivity
<div id="messagesWindow"></div> //Has to listen to clicks on every message appended
<input type="text" id="inputSomething"> //Has to listen to keyUp events
</div>
在这种情况下,最好将事件侦听器附加到每个 div/输入,还是将所有需要的事件侦听器附加到 chatContainer (keyUp, click)?
我已经阅读了委托事件,但我不知道我是否正确。我只想做更好的事情,即使性能差异很小。 非常感谢。
【问题讨论】:
-
直接添加事件 - 附加事件时会影响性能。委托事件 - 性能命中是事件被触发的时间。哪个更好用取决于实际的代码。
-
在如此小的上下文中,任何一个都可以接受。如果您在触发
keyUp时触发事件使用相同的函数,则在创建时将它们附加到父div 没有问题。性能问题只会在您有很多 (1000 >)、进行大量 DOM 修改(此时出现垃圾收集问题)或当您有一个与事件相关的非常大的内存消耗函数时才会蔓延到您的应用程序中。 -
另外,github.com/stevekwan/best-practices/blob/master/javascript/… 是 Javascript 和优化入门的好书。我强烈推荐它。
-
读得很好,谢谢,我意识到当它变得更复杂时,上下文更重要,从这个意义上说,它似乎很清楚,但否则答案对我来说不是很直观。 Epascarello,好吧,那么,一次附加多个事件而不是一个事件所需的内存呢?我认为事件监听可能是存储在 RAM 中并且可能会变得很重的东西,或者这是一个完全错误的观点?当它被触发时,它会消耗 CPU 功率,但“监听”肯定存储在 RAM 中吗?
标签: javascript jquery html events