Javascript 如何获得与Chrome Performance Monitor中相同的节点

Javascript 如何获得与Chrome Performance Monitor中相同的节点,javascript,google-chrome,web-inspector,Javascript,Google Chrome,Web Inspector,Chrome 64带来了一项新功能: 在我的应用程序中,这个数字一直在增加,所以我需要修复它 我无法找出哪些节点在增加。我编写了一个小javascript函数来收集所有dom节点,但它在最后并没有得到相同的数目 为什么函数找到的数字与性能监视器提供的数字不同 function allNodes(node, result) { var nodes = Array.prototype.slice.call(node.childNodes); result = result.conca

Chrome 64带来了一项新功能:

在我的应用程序中,这个数字一直在增加,所以我需要修复它

我无法找出哪些节点在增加。我编写了一个小javascript函数来收集所有dom节点,但它在最后并没有得到相同的数目

为什么函数找到的数字与性能监视器提供的数字不同

function allNodes(node, result) {
    var nodes = Array.prototype.slice.call(node.childNodes);
    result = result.concat(nodes);
    for (var i = 0; i < nodes.length; i++) {
      var child = nodes[i];
      result = allNodes(child, result);
    }
    return result;
}
函数所有节点(节点、结果){
var nodes=Array.prototype.slice.call(node.childNodes);
结果=result.concat(节点);
对于(var i=0;i

以下是我尝试使用的HTML:

<html>
<header><title>This is title</title></header>
<body>
Hello world
</body>
</html>

这是标题
你好,世界

这不是DOM树的视图,而是浏览器渲染过程的视图。我不知道这一切到底意味着什么,但它计算的东西实际上不是“节点”,这也取决于垃圾收集器的行为

使用您的HTML片段,我可以在性能监视器中始终获得8个节点,但只能在新的渲染器中。我还可以通过以下查询找到8个节点:

> queryObjects(EventTarget)
Array(8)
0: Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
1: Window {frames: Window, …}
2: Window {TEMPORARY: 0, PERSISTENT: 1, constructor: ƒ, Symbol(Symbol.toStringTag): "Window"}
3: WindowProperties {constructor: ƒ, Symbol(Symbol.toStringTag): "WindowProperties"}
4: Node {ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5, …}
5: Document {…}
6: document
7: HTMLDocument {constructor: ƒ, Symbol(Symbol.toStringTag): "HTMLDocument"}
length: 8
__proto__: Array(0)
我选择了
EventTarget
,因为它似乎是各种
节点的公共基础原型。所以这是我对这个数字代表什么的最好猜测:一种比您预期的更通用的节点类型,加上大量的垃圾

因此,如果您真的想计算文档中的节点数,我将继续使用这个调用

只要我将鼠标移到上面的输出上,或打开“元素”选项卡,或执行几乎所有操作,性能监视器中的数字8就会立即跳上数十、数百个节点。调试器本身会导致渲染器变慢并产生更多垃圾,这可能是没有办法解决的

为了明确回答您的问题,是否有可能找到这些节点?假设这些对象正在等待垃圾收集,或者在呈现程序的内部引用,但无法从文档中访问,如果没有用于访问垃圾收集器信息的API,则答案必须是否

这是猜测,但请记住,V8有孤立的世界,它们共享底层C++ DOM对象,但有自己的DOM包装器对象。这个性能监视器可能在计算底层的C++ DOM对象,这些对象不是直接可访问的。


该函数的预期结果是什么?我期望文档的所有节点。您如何知道在执行该函数时,
文档的总节点数不是
399
?因为650总是稳定的,永远不会改变您所说的“在我的应用程序中,数量一直在增加,所以我需要修复它”是什么意思? 你能在问题中包含你正在尝试JavaScript的HTML吗?混淆了该功能的命名约定?感谢
queryObjects(EventTarget)
技巧,我认为这将有助于解决我最初的问题。我认为DOM节点还计算不再连接到DOM的元素<代码>子节点
忽略它们。