【问题标题】:Chrome Developer Tools - Dynamically Created ElementChrome 开发者工具 - 动态创建的元素
【发布时间】:2015-01-22 14:20:39
【问题描述】:

有没有办法在 Chrome 的开发者工具中找出哪个 JS 脚本创建了动态元素?如果我在页面上“查看页面源”,则该元素不存在。我可以在 Chrome 的开发者工具中看到该元素。有没有办法具体找出哪个 JavaScript 文件以及我的 JavaScript 文件中的哪一行创建了该元素?

为了帮助澄清:我知道创建了哪个元素...我不知道是哪个 .js 文件创建了它,特别是该 .js 文件中的哪一行

【问题讨论】:

  • 检查 JS 创建的元素是否应用了 classid。也许这样你可以在 JS 文件中搜索特定元素。
  • 在开发者工具的元素标签中。右键单击父级并“中断 -> 子树修改”。
  • 创建一个断点,并查看 Sources 选项卡上的“调用堆栈”部分,如果不能立即看出哪个文件正在进行修改。

标签: javascript html google-chrome-devtools


【解决方案1】:

您可以使用 chrome-devtools-protocol 的实验性功能。 检查这个,https://chromedevtools.github.io/devtools-protocol/tot/DOM/#method-getNodeStackTraces

首先,将“DOM.setNodeStackTracesEnabled”发送到 chrome dev protocl。 其次,使用“DOM.getNodeStackTraces”消息。 因此,您可以从动态创建元素中获取调用堆栈信息。

我使用这些函数编写了自己的程序。

图片:https://imgur.com/a/TtL5PtQ

这是我的项目:https://github.com/rollrat/custom-crawler

【讨论】:

  • 你可以从开发控制台执行此操作吗?我不知道该怎么做。
【解决方案2】:

更新答案

下面你说过:

我知道它是哪个元素...我不知道是哪个 .js 文件创建了它,特别是那个 .js 文件中的哪一行

这不是问题最初的阅读方式。 :-)

如果你知道它是哪个元素,有两种选择:

  1. 您可以使用开发工具在其父元素被修改时触发断点:

    1. 加载页面

    2. 打开开发工具

    3. 转到“元素”面板

    4. 导航到最终将添加目标元素的父元素

    5. 右键单击父元素,然后单击Break on... > Subtree Modifications

    现在,Chrome 会在修改父元素的子树时触发断点,因此您可以看到添加该元素的 JavaScript 代码。

    不幸的是,如果在页面的主要加载过程中添加了元素(例如,在 HTML 的解析过程中,通过立即运行而不是等待的脚本),它不会触发该断点.

  2. 如果元素中有任何似乎特定于它的文本(内容、idclass、某些属性等),一旦页面加载,您可以使用 Chrome 的强大搜索功能尝试查找该文本:

    1. 加载页面

    2. 打开开发工具

    3. 转到“来源”选项卡

    4. 单击 Ctrl+Shift+F,即“在文件中查找”——它会查找与页面关联的所有文件,而不仅仅是“当前”文件

    5. 键入您认为可能有助于识别添加元素的代码的文本

    6. 按回车键,所有匹配项将显示在下方

    您甚至可以使用正则表达式。


原答案

不,没有简单的方法可以区分页面加载后通过 JavaScript 创建的元素与初始 HTML 解析创建的元素。

或者至少,在页面上运行之前任何其他 JavaScript 运行之前,必须将 JavaScript 添加到运行的页面中,我猜这是一个要求。

但如果您可以在任何其他 JavaScript 运行之前将 JavaScript 添加到页面中,这实际上很容易做到:

Array.prototype.forEach.call(document.querySelectorAll("*"), function(element) {
    element.setAttribute("data-original", "");
});

这会用一个属性标记页面上的每个元素,告诉您该代码运行时它就在那里。您可以在 Dev Tools 的 Elements 面板中看到这些属性。因此,如果您看到一个没有该属性的元素,您就知道它是后来添加的。

document.querySelectorAll("*") 是一把大锤子,你可能不想在生产代码中使用,但在调试/开发时临时使用,没关系。

如果你以后想知道其他代码创建的元素,你可以在控制台中这样做:

Array.prototype.forEach.call(document.querySelectorAll("*"), function(element) {
    if (element.getAttribute("data-original") === null) {
        console.log(element);
    }
});

这会输出你运行早期代码时页面上没有的所有元素,Chrome 的控制台真的很酷——你可以右键单击控制台中的元素显示并选择“在元素面板中显示”来查看该元素的确切位置。

【讨论】:

  • 我知道它是哪个元素...我不知道是哪个 .js 文件创建了它,特别是那个 .js 文件中的哪一行
  • @Adam:啊,这不是问题最初的阅读方式。我已经更新了答案,希望对您有所帮助。
  • @T.J.Crowder 谢谢。我选择选项 1。当我按照这些指示进行操作时,它指向 jquery,但我知道内容正在添加到 scripts.js 文件中。 (我在源选项卡中看到 scripts.js,但随着我不断推进函数调用,它一直显示 jquery)我可以使用选项 2,它只是比我想要的要少一些。
  • @Adam:当您遇到断点(选项 1)时,如果您转到 Sources 选项卡,在右侧找到“Call Stack”。这会让你找到调用 jQuery 来添加元素的函数(它可能很容易在堆栈中向下三或四行)。
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 2021-08-08
  • 2017-05-31
  • 1970-01-01
相关资源
最近更新 更多