Chrome 在将空文档片段插入到 dom 之前将其输出到控制台

问题描述 投票:0回答:1

将文档片段插入 dom 时,Chrome 浏览器会向控制台输出空文档片段,而 Firefox 在插入前输出非空片段,在插入后输出空片段。 如果片段没有插入到 dom 中,那么 Chrome 也会将非空片段输出到控制台。 我正在运行最新的稳定版本(Chrome 126 和 Firefox 128)

const init = function() {
  let fn0 = function() {
    let fragment = document.querySelector('template').content.cloneNode(true);
    console.log('before insertion: ', fragment); // empty in Chrome but not in Firefox
    document.querySelector('ul').append(fragment);
    console.log('after insertion: ', fragment);
  };
  let fn1 = function() {
    let fragment = document.querySelector('template').content.cloneNode(true);
    console.log('no insertion: ', fragment); // non-empty in both
  };
  let buttons = document.getElementsByTagName('button');
  buttons[0].addEventListener('click', fn0);
  buttons[1].addEventListener('click', fn1);
};
window.addEventListener('load', init);
.container {
  width: 200px;
  height: 200px;
  display: flex;
  flex-direction: column;
  font-family: sans-serif;
}

.bar {
  flex-basis: max-content;
  display: flex;
  padding: 6px;
  gap: 6px;
}

.list {
  overflow: auto;
  border: 1px solid;
}

button {
  text-align: left;
}
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>template test</title>
</head>

<body>
  <div class="container">
    <div class="bar">
      <button type="button">log document fragment before insertion, then insert the fragment and log the fragment after insertion</button>
      <button type="button">log document fragment without inserting</button>
    </div>
    <div class="list">
      <ul>
        <template>
          <li>list item</li>
        </template>
      </ul>
    </div>
  </div>
</body>

</html>

javascript google-chrome dom console.log documentfragment
1个回答
0
投票

这里有两点。首先,控制台是异步的,因此您无法真正知道您的值何时会在控制台中实际呈现。其次,chrome 实际上会向您显示对象的当前状态,而不是您记录它时的状态。考虑这段代码:

const obj = {a: 1};
console.log(obj);
obj.b = 2;
delete obj.a;

如果您尝试在 chrome 中登录它,您会看到它具有您期望的形状 (

{a: 1}
)。但是,如果您尝试展开它以查看属性,您将看到它根本没有“a”属性,尽管事实上它是在属性存在时记录的。您的 DocumentFragment 也会发生同样的情况 - 您会看到它在“当前”时间的状态,但期望看到“过去”的状态。这里的另一件事是记录常规对象和 DOM 结构(如 DocumentFarment 或其他元素)的差异。在第一种情况下,您会看到它的字符串化版本,然后可以展开以查看真实的东西。在第二种情况(您的情况)中,您从一开始就看到对象。

这非常令人困惑,但是当您想要跟踪对象在其生命周期中如何变化时,特别是与断点(在浏览器中设置或使用

debugger
语句设置)配对时非常有用,而不必多次记录相同的内容。

© www.soinside.com 2019 - 2024. All rights reserved.