innerHTML and text normalization

本文探讨了Internet Explorer浏览器对innerHTML属性应用HTML规范化的问题,特别是对于<pre>和<textarea>元素中空白字符的不当处理。提供了一个解决此问题的方法,通过检查outerHTML属性并为<pre>元素设置自定义内容。
[url]http://www.quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html[/url]

IE applies HTML normalization to the data that is assigned to the innerHTML property. This causes incorrect display of whitespace in elements that ought to preserve formatting, such as <pre> and <textarea>

Test page. Workaround is not included.


I've found out that setting outerHTML doesn't trigger normalization. So I've decided to test for .outerHTML property and if not false (i.e., IE), prepend and append the opening and closing pre tags to the content I want to set and assign that to outerHTML.

// Workaround for IE <PRE> innerHTML normalization quirk
if (elem.tagName == "PRE" && "outerHTML" in elem)
{
elem.outerHTML = "<PRE>" + str + "</PRE>";
}
else
{
elem.innerHTML = str;
}

(Works with IE & FF)
### 3.1 `innerText` 和 `innerHTML` 的区别 在 JavaScript 中,`innerText` 和 `innerHTML` 都是用于操作 DOM 元素内容的属性,但它们在功能和使用场景上存在显著差异。 #### 获取内容时的区别 `innerText` 仅返回元素内部的纯文本内容,会自动去除所有 HTML 标签。例如,如果一个元素包含嵌套的 `<p>` 或 `<a>` 标签,`innerText` 只会返回这些标签中的文本内容,而不会返回任何 HTML 结构。相比之下,`innerHTML` 会返回包括 HTML 标签在内的完整内部结构。[^2] ```javascript let element = document.getElementById("example"); console.log(element.innerText); // 仅输出纯文本 console.log(element.innerHTML); // 输出包含 HTML 标签的内容 ``` #### 设置内容时的区别 当使用 `innerText` 设置内容时,HTML 标签会被视为普通文本处理,不会被浏览器解析为 HTML 元素。这意味着即使设置了 HTML 内容,它也会以纯文本形式显示。而 `innerHTML` 在设置内容时会将传入的字符串解析为 HTML,因此可以插入新的 HTML 结构。[^3] ```javascript element.innerText = "<p>这是一个段落。</p>"; // 显示为文本 element.innerHTML = "<p>这是一个段落。</p>"; // 显示为 HTML 段落 ``` #### 性能与安全性 `innerHTML` 的执行速度通常比 `innerText` 更快,因为它直接操作 HTML 结构。然而,使用 `innerHTML` 插入不受信任的内容可能会导致 XSS(跨站脚本攻击)漏洞,因此需要特别注意内容的安全性。[^1] #### 用途与限制 `innerText` 主要用于获取或设置纯文本内容,适用于需要过滤 HTML 标签的场景。此外,`innerText` 是只读的,不能用于修改 HTML 内容[^4]。而 `innerHTML` 则适用于需要动态更新 HTML 结构的情况,例如根据用户输入动态生成页面内容。[^5] ### 3.2 相关问题 1. 使用 `innerText` 和 `textContent` 有什么区别? 2. 如何安全地使用 `innerHTML` 来防止 XSS 攻击? 3. 在 Vue 或 React 等框架中如何替代 `innerHTML`? 4. `innerText` 是否支持跨浏览器兼容性? 5. `innerHTML` 是否可以用于修改整个 HTML 文档的内容?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值