【问题标题】:HTMLElement.innerHTML adding attributes to </span> closing tag, and I don't know whyHTMLElement.innerHTML 将属性添加到 </span> 结束标记,我不知道为什么
【发布时间】:2022-02-06 15:38:47
【问题描述】:

我正在使用带有管道的 Angular 13 来重新格式化 contenteditable div 中的文本。一切正常,直到 innerHtml 被新代码替换。最后一个子节点(span 标记)的属性被附加到结束 span 标记的内部。我不知道为什么会这样。

我在 Chromium (MS Edge) v97.0.1072.76 和 Firefox v95.0 上使用带有 Angular 13 的 TypeScript。

这是一个例子:

reformatContent(event: Event) {
const el = (event.target as HTMLElement);

const originalHtml = el.innerHTML;
console.log(originalHtml); // "Some text <span id="someTextId" class="someTextClass">More Text</span>

const newHtml = this.reformatText(originalHtml);
console.log(newHtml); // "Some text <span id="someTextId" class="someTextClass someNewClass">More Text</span> <-- this is ok, what I expected.

el.innerHTML= newHtml;
console.log(el.innerHTML); // "Some text <span id="someTextId" class="someTextClass someNewClass">More Text</span id="someTextId" class="someTextClass someNewClass"> <-- why is this happening???
}

我只想清楚originalHtml 包含关闭&lt;/span&gt; 标记。所以我不认为浏览器试图关闭标签。

编辑错字。

编辑 2: 我更新了错别字的原始代码,并更清楚地说明我是如何获得 innerHTML 的。我不认为这就是问题所在,但显然就是这样,因为它有效:

reformatContent(event: Event) {
const e = (event.target as HTMLElement);
const el = document.getElementById(e.id);

const originalHtml = el.innerHTML;
console.log(originalHtml); // "Some text <span id="someTextId" class="someTextClass">More Text</span>

const newHtml = this.reformatText(originalHtml);
console.log(newHtml); // "Some text <span id="someTextId" class="someTextClass someNewClass">More Text</span> <-- this is ok, what I expected.

el.innerHTML= newHtml;
console.log(el.innerHTML); // "Some text <span id="someTextId" class="someTextClass someNewClass">More Text</span> <-- now it works
}

我不明白为什么原始获取元素的方式会导致这个问题。我修复了它,但我真的很想了解这里发生了什么。

【问题讨论】:

  • 您有一个拼写错误。属性名称为innerHTML。当您访问innerHtml
  • 我不知道为什么会这样,但我解决了。我的 el 实际上是从一个事件(event.target 作为 HTMLElement)中提供的。我不知道为什么,但这导致了问题。我已经编辑了帖子以显示发生了什么。我仍然很好奇为什么会出现这个问题。 Pankaj,是的,帖子中有错字。我的实际代码是innerHTML。很抱歉造成混乱。
  • 整个方法看起来很奇怪。为什么不使用适当的 dom 运算符?看起来你只是在添加一个类?

标签: javascript html angular typescript innerhtml


【解决方案1】:

什么是reformatText函数?

this.reformatText(originalHtml)

这个函数正在改变你的跨度,你的错误来自这里。

您可能会说您的结果是正确的,但您在无效变量(originalHtml)上使用了 console.log

什么是 originalHtml?在哪里?

但一般我知道,你的问题是因为这条线:

const newHtml = this.reformatText(originalHtml);

【讨论】:

  • 似乎如此。可能会替换“跨度”之后的所有内容,因此将打开和关闭“跨度”都视为要替换的东西。
  • 我没有包含重新格式化文本,因为它非常广泛。但是,我认为这不是问题,因为它产生的结果是正确的。直到我用它替换了innerHTML,它才成为一个问题。另外,我想出了如何解决它,尽管我不明白为什么会发生这种情况。查看我更新的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 2022-06-24
相关资源
最近更新 更多