【发布时间】: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 包含关闭</span> 标记。所以我不认为浏览器试图关闭标签。
编辑错字。
编辑 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