将“<span>”替换为文本节点:是程序员错误还是浏览器错误?

Replacing `<span>`with text node: Is it a programmer error, or a browser error?

提问人:U. Windl 提问时间:10/30/2023 最后编辑:Mark RotteveelU. Windl 更新时间:11/16/2023 访问量:47

问:

我正在尝试替换我的 HTML 中的一些占位符,这些占位符看起来像.使用以下 JavaScript 代码仅替换了第一次出现,我想知道为什么:<span id="Something" />

function set_placeholder(cls, txt)
{
    txt = document.createTextNode(txt);
    for (var e of document.getElementsByClassName(cls)) {
        e.parentNode.replaceChild(txt, e);
    }
}

替换后,集合似乎无法找到下一个匹配项。span

因此,我尝试使用以下变体插入文本:

function set_placeholder(cls, txt)
{
    for (var e of document.getElementsByClassName(cls)) {
        e.innerText = txt;
    }
}

现在所有出现的情况都被替换了,这让我怀疑是我的错,还是浏览器(Firefox 102)的错,当第一个变体失败时。

HTML 示例

实际的 HTML 要复杂得多,但这里有一些示例:

<html>
 <p><span class="ph-customer" /> bestellte am <span class="ph-customer-date" /> folgende Artikel:</p>
<!-- ... -->
 <table>
  <tr>
    <td><span class="ph-customer-date" />,
    <span class="ph-customer-name" /></td>
  </tr>
 </table>
<!-- ... -->
</html>

例如,出现两次,但调用只会替换第一次出现。ph-customer-dateset_placeholder('ph-customer-date', '30.12.2023')

JavaScript DOM 替换 集合

评论

0赞 Rory McCrossan 10/30/2023
您能否将相关的 HTML 添加到问题中,以便我们可以创建该问题的可调试工作示例
3赞 Robin Zigmond 10/30/2023
developer.mozilla.org/en-US/docs/Web/API/Node/replaceChild .我认为这可以解释你的问题?Warning: If the new node is already present somewhere else in the DOM, it is first removed from that position.
0赞 Konrad 10/30/2023
进入循环document.createTextNode(txt)
0赞 U. Windl 10/30/2023
@Konrad我已经尝试过了,但这似乎不是问题的根本原因。
0赞 U. Windl 10/30/2023
@RobinZigmond 如果是这样的话,我只看到最后一个被替换了,对吧?我认为问题在于替换后迭代集合。span

答: 暂无答案