innerHTML的替代方案?

Kdg*_*Dev 37 javascript w3c innerhtml

我想知道是否有办法在不使用innerHTML的情况下更改HTML中的任何内容.

我问的原因是因为它对W3C有点不满意.我知道这是挑剔,但我只是想知道,有办法吗?

编辑:人们似乎误解了我在这里问的问题:我想找到一种方法来有效地改变正在显示的文本.

如果我有:

<div id="one">One</a>
Run Code Online (Sandbox Code Playgroud)

innerHTML允许我这样做:

var text = document.getElementsById("one");
text.innerHTML = "Two";
Run Code Online (Sandbox Code Playgroud)

我屏幕上的文字会发生变化.
我不想附加更多文字,我希望改变现有的文字.

Tur*_*nor 38

推荐的方法是通过DOM操作,但它可能非常冗长.例如:

// <p>Hello, <b>World</b>!</p>
var para = document.createElement('p');
para.appendChild(document.createTextNode('Hello, '));

// <b>
var b = document.createElement('b');
b.appendChild(document.createTextNode('World');
para.appendChild(b);

para.appendChild(document.createTextNode('!'));

// Do something with the para element, add it to the document, etc.
Run Code Online (Sandbox Code Playgroud)

编辑

为了响应您的编辑,为了替换当前内容,您只需删除现有内容,然后使用上面的代码填写新内容.例如:

var someDiv = document.getElementById('someID');
var children = someDiv.childNodes;
for(var i = 0; i < children.length; i++)
    someDiv.removeChild(children[i]);
Run Code Online (Sandbox Code Playgroud)

但正如其他人所说的那样,我建议使用类似jQuery的东西,因为并非所有浏览器都完全支持DOM,而那些确实存在由JavaScript库内部处理的怪癖.例如,jQuery看起来像这样:

$('#someID').html("<p>Hello, <b>World</b>!</p>");
Run Code Online (Sandbox Code Playgroud)

  • jQuery在代码中多次使用innerHTML,因此建议使用jQuery以避免使用innerHTML对IMHO没有多大意义. (13认同)
  • 其他方式:)他们的观点是,使用innerHTML,可以将无效标记插入XML/XHTML文档.尽管如此,他们似乎已经用HTML5改变了主意. (2认同)

And*_*are 12

更好的方法是使用document.createTextNode.使用此函数的主要原因之一innerHTML是,所有HTML字符转义都将为您处理,而如果您只是设置,则必须自己转义字符串innerHTML.

  • 但是,似乎innerHTML比W3C DOM方法快得多:http://www.quirksmode.org/dom/innerhtml.html. (5认同)
  • 这取决于你在做什么; 说一种方法更好的方法是误导的.当对许多元素进行childNode列表操作时,DOM往往会变慢(趋向于O(n²)),而innerHTML可以一次完成所有这些操作.但是innerHTML的解析/序列化步骤可以使其他操作变慢. (4认同)

Bil*_*ard 8

您可以通过操纵DOM获得相同的效果.更改文本的最安全方法是删除元素的所有子节点,并用新的文本节点替换它们.

var node = document.getElementById("one");

while( node.firstChild )
    node.removeChild( node.firstChild );
node.appendChild( document.createTextNode("Two") );
Run Code Online (Sandbox Code Playgroud)

在用新文本替换之前,删除子节点会删除元素的文本内容.

大多数开发人员避免使用innerHTML的原因是通过DOM访问元素符合标准.


Ion*_*tan 7

如果您只想更改纯文本,那么有一个更快的解决方案依赖于标准:

document.getElementById("one").firstChild.data = "two";
Run Code Online (Sandbox Code Playgroud)

无论如何,请注意innerHTML将成为即将推出的HTML 5标准的一部分.


小智 5

简单.

替换text.innerHTML = 'two'text.firstChild.nodeValue = 'two'.


小智 5

也在寻找绕过的好选择element.innerHTML我终于找到了解决方案:

HTMLElement.prototype.htmlContent = function(html)
{
    var dom = new DOMParser().parseFromString('<template>'+html+'</template>', 'text/html').head;
    this.appendChild(dom.firstElementChild.content);
}

//-- document.getElementById('my-id').innerHTML = string_of_html;
document.getElementById('my-id').htmlContent(string_of_html);
Run Code Online (Sandbox Code Playgroud)

另一种没有 <template> 标签的替代方法,而是循环:

HTMLElement.prototype.htmlContent = function(html)
{
    var dom = new DOMParser().parseFromString(html, 'text/html').body;
    while (dom.hasChildNodes()) this.appendChild(dom.firstChild);
}
Run Code Online (Sandbox Code Playgroud)

请记住,当innerHTML“替换”内容时,此方法实际上是“添加”内容...

这可能有帮助:

HTMLElement.prototype.clearContent = function()
{
    while (this.hasChildNodes()) this.removeChild(this.lastChild);
}

//-- document.getElementById('my-id').innerHTML = '';
document.getElementById('my-id').clearContent();
Run Code Online (Sandbox Code Playgroud)

文档:https
: //github.com/swannty/escaping-innerHTML 性能https : //jsperf.com/escaping-innerhtml


Jon*_*Lee 5

这是一个非常古老的问题。

现在,事情发生了变化:

element.innerText = "Hi There!"
Run Code Online (Sandbox Code Playgroud)

一条单行线。自 2016 年以来,每个浏览器都支持此功能。