在Angular中替换innerHTML不必要地关闭标签[重复]

Posted

技术标签:

【中文标题】在Angular中替换innerHTML不必要地关闭标签[重复]【英文标题】:Replacing innerHTML closes tag unnecessarily in Angular [duplicate] 【发布时间】:2020-03-08 14:00:59 【问题描述】:

我在 Angular 中有一个函数,它接受 DOM 内容并进行搜索和替换以注释特定文本。问题是被替换的文本(使用innerhtml)过早地关闭了标签。简单来说,就是这样写的:

--><p _ngcontent-atr-c1="" class="paragraph-body ng-star-inserted"><div>Blah blah</div></p><!--bindings=

并认为<p> 未关闭且</p> 未打开,因此innerHTML 不恰当地自动关闭和打开标签,如下所示:

--><p _ngcontent-atr-c1="" class="paragraph-body ng-star-inserted"></p><div>Blah blah</div><p></p><!--bindings=

我该如何解决这个问题?

我的函数(查找要替换的 searchTerm 的大小写变体):

startSearch(searchTerm: string) 
    const content = document.getElementById('chapter').children;
    const regexLower = new RegExp(`$searchTerm.replace(/[-\/\\^$*+?.()|[\]]/g, '\\$&')`, 'g');
    const regexUpper = new RegExp(`$searchTerm.toUpperCase().replace(/[-\/\\^$*+?.()|[\]]/g, '\\$&')`, 'g');
    const regexCapitalized = new RegExp(
      `$searchTerm.replace(/^\w/,
      c => c.toUpperCase()).replace(/[-\/\\^$*+?.()|[\]]/g, '\\$&')`, 'g'
    );
    for (let i = 0; i < content.length; i++) 
      const block = content[i].innerHTML;
      block.replace(regexLower, `<span class="highlight">$searchTerm.toLowerCase()</span>`);
      block.replace(regexUpper, `<span class="highlight">$searchTerm.toUpperCase()</span>`);
      block.replace(regexCapitalized, `<span class="highlight">$searchTerm.replace(/^\w/, c => c.toUpperCase())</span>`);
      content[i].innerHTML = block;
    

【问题讨论】:

为什么不解释就投反对票?提出您认为类似的问题并不是投反对票的理由 (meta.stackexchange.com/questions/10841/…),尤其是因为它是对所引用的类似问题的不同描述。 【参考方案1】:

根据网络浏览器,您的 HTML 格式不正确。

它不允许在&lt;p&gt; 标签内容中使用&lt;div&gt; 标签。

【讨论】:

以上是关于在Angular中替换innerHTML不必要地关闭标签[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Anylogic:避免在占用块中不必要地执行进程

不必要地将函数标记为暂停以支持通用抽象

iOS 中的 Bar 部分被不必要地扩展

错误在条件表达式中不必要地使用布尔文字 no-unneeded-ternary

值不必要地四舍五入

改变的 GradientDrawable 在不同的地方被不必要地重复使用