在每个 DOM 更改“完成”时触发 javascript 事件

Posted

技术标签:

【中文标题】在每个 DOM 更改“完成”时触发 javascript 事件【英文标题】:Firing javascript event on every DOM change "complete" 【发布时间】:2013-11-05 12:46:34 【问题描述】:

我知道这可以通过某种方式处理,但到目前为止,这让我很难过。我正在编写一个脚本,并希望在 DOM 操作完成后触发一些特定的功能。我无法修改/添加/删除任何其他脚本(因为它可能会使用某些框架注入到页面中)。该页面使用 ajax 请求(未在 jQuery 中实现)来加载/修改内容。现在我希望在每个 DOM 修改完成后触发一个事件。我目前的方法是在每个 DOMSubtreeModified 事件中触发该函数。像这样的

$(document).bind('DOMSubtreeModified', doSomeStuff);

但是这种方法的缺点是,假设 ajax 在一次调用中加载 10 个元素,然后针对每个元素触发 doSomeStuff。这可以限制为仅在加载第 10 个元素后触发吗?类似于重置 $(document).ready() 事件?所以 $(document).ready() 每次 DOM 准备好时都会触发(在加载 ajax 内容之后)

【问题讨论】:

DOMSubtreeModified 已弃用 ***.com/questions/6659662/…,建议改用它 updates.html5rocks.com/2012/02/… @Bernhard DOMSubtreeModified 仍然适用于 chrome,但突变观察者仍然如何告诉我文档是否再次准备好? 【参考方案1】:

使用 Mutation Observer,您可以监听更改,如果触发事件,则文档已更改。

MutationObserver = window.MutationObserver || window.WebKitMutationObserver;

var observer = new MutationObserver(function(mutations, observer) 
    // Add the actions to be done here if a changes on DOM happened 
    console.log(mutations, observer);

);

// Register the element root you want to look for changes
observer.observe(document, 
  subtree: true,
  attributes: true
);

【讨论】:

完全有效,但我不希望它在每次 dom 更改时启动。仅在 dom 更改完成时触发怎么样?...类似于 jQuery 中的 ajaxComplete 但没有 jQuery...听所有内容加载... @whizzkid 没有所有圆顶更改完成的事件。此答案仅在完成/发生单个更改时才观看。因此,如果您需要一个侦听器来完成未知数量的更改,您必须创建一个计数器或其他东西,并在观察者回调中将计数器减少到 0。如果它是 0,那么您知道任何更改都已完成。但这不是一件好事,更好的面向回调的架构更合理。 可以重新初始化像 $(document).ready() 这样的东西在再次准备好时再次触发吗? 否,因为文档准备就绪与您尝试执行的操作完全不同。 javascript 处理大量事件而不是单个事件是有原因的 不要明确地将其视为“准备就绪”...假设当 dom 完成加载新内容时触发事件。【参考方案2】:

在 jQuery 中,有一个方法 ajaxComplete,它在每次完成 AJAX 调用后调用给定的函数。查看更多here。

我建议使用 jQuery 或者(如果这不是一个选项)分析这个函数的源代码,看看它是如何在那里完成的。

【讨论】:

我没有成功实现这一点。这是否只监听 jQuery ajax 请求?...因为所关注的页面没有使用 jQuery 的 ajax 函数。 文档说Now, make an Ajax request using any jQuery method 所以是的,我认为它只适用于 jQuery 请求。更深入地了解来源可能会有所帮助:) 如果你不使用 jQuery,不要指望事情会很容易;)看看 $.ajax source code,分析所有出现的 fireGlobals。触发 ajaxComplete 只是必须放入 AJAX 请求中的一行代码;) 假设我正在构建一个扩展,它无法控制页面如何加载内容。但我只想在 dom 完成加载请求时执行它。怎么样? 通过这种方式我非常成功。感谢您的回答。你应该得到更多的 +。【参考方案3】:

我知道我参加聚会有点晚了,但听起来你可能想要去抖动你的 doSomeStuff 函数。如果你不反对引入对 Underscore.js 的依赖,它有一个很好的 debounce 函数。

【讨论】:

以上是关于在每个 DOM 更改“完成”时触发 javascript 事件的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript&jQuery.DOM事件

在 DOM 元素的样式对象更改后,您可以使用 javascript 钩子触发器吗?

jQuery和dom页面加载完成时触发的事件

更改DOM后刷新浏览器悬停效果

当输入的值以编程方式更改时触发更改事件

react啥时候对真实dom应用更改?