【问题标题】:Should I Be Using $(document)我应该使用 $(document)
【发布时间】:2015-04-07 22:42:06
【问题描述】:

在我的 Web 应用程序中,我有一个带有 AJAX 删除/删除按钮的购物车,该按钮会刷新购物车并显示新的购物车。

代码是这样的:

$(".delBtn").on("click", function(){
    // Code here
});

当显示新购物车时,删除按钮将不再起作用。

我现在改用以下内容:

$(document).on("click", ".delBtn", function(){    
    // Code here
});

它按预期工作,但它是可用的最佳选择吗?高级开发人员或专家会认为这是糟糕的代码吗?

【问题讨论】:

  • 这两个代码sn-ps的区别你明白了吗?这是回答您问题的关键。
  • 就我个人而言,在玩 AJAX 时,我会监听来自 $(document) 的事件。到目前为止我还没有遇到任何问题。
  • 通常建议您将代理绑定到树的尽可能远的位置。我可能会使用一个选择器来定位购物车中没有被替换/更新的部分。
  • “body”是可视/交互 DOM 的最外层包装元素。没有必要比这更高:$(document.body).on(...)
  • 阅读这篇文章可能是一个好的开始:stackoverflow.com/questions/14879168/…

标签: jquery


【解决方案1】:

首先,为什么第一个代码 sn -p 不起作用。

第一个代码的意思是“选择当前页面上的每个元素,并在单击时运行一个函数。”但是,在您执行此操作时,您的按钮不在页面上(因为尚未添加它),因此不会找到任何元素。相比之下,第二种方法说,每当您单击页面时,如果单击的元素具有类“delBtn”,则运行该函数。因为这只是寻找网页上的点击,所以它适用于稍后添加的元素

至于原问题:

是和不是。没关系,但您可能希望将其更改为不同的内容。其工作方式是 jquery 监听文档上的每个单击事件,并检查单击的元素是否与选择器匹配。因此,jquery 必须在每次单击页面上的某些内容时运行一些代码。

您可能应该做的是将 $(document) 更改为包含该按钮的任何父元素。这将有更好的性能,因为 jquery 只需要检查包含按钮的实际元素上的点击事件。

【讨论】:

  • 感谢所有发表评论的人。我同意@Harko 这个答案非常好。这说得通。虽然我不是 100% 清楚为什么原始代码 sn-p 在 ajax 请求后不起作用
  • 一个很好的答案,我不能不同意。我只想指出,“性能”在这里是相对的。侦听已经在 DOM 树上冒泡的事件,然后执行查询选择不是 heavy 操作。如果他将事件附加到包含按钮的元素,然后删除该元素,他可能会发生内存泄漏,这会大大降低性能。只是在这里迂腐;)
猜你喜欢
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
相关资源
最近更新 更多