为了澄清问题:我知道哪个元素被创建了...我不知道的是哪个.js文件创建了它,特别是在该.js文件中的哪一行。
更新后的答案:
在你之前说:
我知道是哪个元素...但我不知道是哪个.js文件创建了它,以及具体是哪行在那个.js文件中
这不是原始问题的内容。 :-)
如果你知道是哪个元素,有两个选项:
您可以使用开发工具在其父元素修改时触发断点:
加载页面
打开开发工具
转到“元素”面板
导航到目标元素最终将添加到其中的父元素
右键单击父元素,然后单击断点 > 子树修改
现在,Chrome 将在父元素的子树被修改时触发断点,因此您可以看到添加元素的 JavaScript 代码。
不幸的是,如果元素在页面的主要加载期间(例如,在 HTML 解析期间通过立即运行的脚本添加)添加,则不会触发该断点。
如果元素中有任何特定于它的文本(内容、id
、class
、某个属性等),则在页面加载后,您可以使用 Chrome 强大的搜索功能尝试查找该文本:
加载页面
打开开发工具
转到“源”选项卡
点击 Ctrl+Shift+F,这是“在文件中查找”,它会查找与页面相关联的所有文件,而不仅仅是“当前”文件
键入您认为可能有助于识别添加元素代码的文本
按 Enter,所有匹配项都会显示在下面
您甚至可以使用正则表达式。
原始答案:
没有简单的方法可以区分通过 JavaScript 在页面加载后创建的元素与通过初始 HTML 解析创建的元素。
或者至少,在运行页面上的任何其他 JavaScript 之前添加运行的 JavaScript 不存在时,就没有。
但是,如果你可以在页面上添加 JavaScript,使其在运行页面上的任何其他 JavaScript 之前运行,那么实际上很容易做到:
Array.prototype.forEach.call(document.querySelectorAll("*"), function(element) {
element.setAttribute("data-original", "");
});
该代码会为页面上的每个元素添加一个属性,告诉您当代码运行时它在那里。您可以在开发工具的元素面板中看到这些属性。因此,如果您看到一个没有该属性的元素,您就知道它是后来添加的。
document.querySelectorAll("*")
是一个大锤子,您可能不想在生产代码中使用,但在调试/开发时暂时使用是可以的。
如果您想了解其他代码创建的元素,可以在控制台中执行以下操作:
Array.prototype.forEach.call(document.querySelectorAll("*"), function(element) {
if (element.getAttribute("data-original") === null) {
console.log(element);
}
});
这将输出之前代码运行时不在页面上的每个元素,Chrome 的控制台非常酷炫——您可以右键点击控制台中的元素显示,并选择“在元素面板中显示”以精确定位该元素所在位置。
.js
文件创建的,以及在该.js
文件中具体的代码行。 - Tom您可以使用chrome-devtools-protocol的实验性功能。 请查看https://chromedevtools.github.io/devtools-protocol/tot/DOM/#method-getNodeStackTraces
首先,向chrome dev protocl发送'DOM.setNodeStackTracesEnabled'。 其次,使用'DOM.getNodeStackTraces'消息。 这样,您就可以从动态创建元素中获取调用堆栈信息。
我使用这些函数编写了自己的程序。