【问题标题】:Is there any possible danger of using "JQuery.on()" profusely大量使用“JQuery.on()”是否有任何可能的危险
【发布时间】:2014-04-09 11:52:14
【问题描述】:

我正在为一个大型项目编写 Javascript 控制器,我发现自己经常使用“JQuery .on()”函数来处理所有点击事件,因为大部分内容都是动态下载的。

考虑到我在再次绑定之前使用“JQuery .off()”解绑点击事件,是否存在大量使用它的风险。

$('#container').off('click', '[data-link=some-link-id').on('click', '[data-link=some-link-id]', function () {
     // handle event here...
});

【问题讨论】:

  • 您正在使用事件委托语法。这样做的重点是您不必在动态加载内容时一直调用它。
  • 错误使用有危险。
  • 你能解释一下吗
  • jQuery 本身并不能很好地扩展。它只是创建意大利面条代码球。如果你想一直摆脱绑定和解除绑定事件,你应该切换到像 Backbone 或 Angular 这样的 MV* 框架。
  • @Rabi 我的意思是你永远不需要这样做。如果你多次调用使用事件委托的代码你做错了

标签: javascript jquery


【解决方案1】:

根据我的经验,这实际上取决于应用程序。我发现广泛使用 jQuery 会导致浏览器的内存开销很高。从使用堆跟踪调试(在谷歌浏览器中),我发现这是因为 jQuery 在内存中保留了很多对象。我发现的主要问题是当您使用 jQuery 创建 DOM 节点或应用非标准 javascript 遍历或函数时,jQuery 必须跟踪这些特定节点。

当涉及到处理程序时,除了普通的 javascript 之外,不应该有太多的内存开销。我发现在优化方面,每个实例都特定于代码和它必须运行的环境。如果您需要您的代码在移动设备上运行,那么由于这些环境的内存限制,您需要使堆尽可能低。

我发现,如果您遇到怀疑与 javascript 相关的性能问题,检查堆快照是唯一有效的调试方法。我通常使用以下步骤减少内存占用:

  1. 使用本机 javascript 代替 $('<div>') 创建任何对象
  2. 尝试删除每个循环
  3. 使用 ID 将任何 DOM 查询更改为原生 javascript
  4. 将任何事件处理程序(onclick 等)移动到本机 javascript 或将它们放在相关 DOM 节点的相关属性中

从提供的示例中,我有点担心数据处理程序,因为根据我的经验,这将需要 jQuery 来跟踪内存中的大量对象。如果我要优化这段代码,我会尽可能多地将这些代码迁移到原生 JS。

【讨论】:

    猜你喜欢
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2019-11-28
    • 2015-04-19
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    相关资源
    最近更新 更多