我不知道是否有改变的任何HTML文本,而无需使用innerHTML的一种方式。
原因我问的是,因为它是在由W3C有点皱起了眉头。我知道这是吹毛求疵,但我只是想知道,有没有办法?
编辑:人们似乎误解我问什么在这里我想找到一种方法,用途不同改变所显示的文字。
如果我有:
<div id="one">One</a>
innerHTML的允许我这样做:
var text = document.getElementsById("one");
text.innerHTML = "Two";
而我的屏幕上的文字也会有变化。 我不希望追加更多的文本,我想改变现有的媒体链接文本。
推荐的方法是通过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.
编辑
在回答您的编辑,以取代目前的内容,只需删除现有的内容,然后用上面的代码填写新的内容。例如:
var someDiv = document.getElementById('someID');
var children = someDiv.childNodes;
for(var i = 0; i < children.length; i++)
someDiv.removeChild(children[i]);
但正如别人说,我建议你使用像jQuery的替代,因为不是所有的浏览器完全支持DOM,和那些具有由JavaScript库内部处理的怪癖。例如,jQuery的看起来是这样的:
$('#someID').html("<p>Hello, <b>World</b>!</p>");
也找一个很好的选择绕过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);
无<模板>标记,但代替循环另一替代:
HTMLElement.prototype.htmlContent = function(html)
{
var dom = new DOMParser().parseFromString(html, 'text/html').body;
while (dom.hasChildNodes()) this.appendChild(dom.firstChild);
}
请记住,这种方法实际上“加”内容时innerHTML的“替换”的内容...
这可以帮助:
HTMLElement.prototype.clearContent = function()
{
while (this.hasChildNodes()) this.removeChild(this.lastChild);
}
//-- document.getElementById('my-id').innerHTML = '';
document.getElementById('my-id').clearContent();
DOC:https://github.com/swannty/escaping-innerHTML PERF:https://jsperf.com/escaping-innerhtml
我有时会发现它有助于存储的直接引用文本节点,如果我要定期进行更新。我做这样的事情:
var dynamicText = myDiv.appendChild(document.createTextNode("the initial text"));
然后,每当我需要更新它,我只是这样做:
dynamicText.nodeValue = "the updated text";
这防止不必走DOM或添加或删除任何子女。
insertAdjacentHTML()是要走的路。了解更多:Click for documentation
这样做的更好的办法是使用document.createTextNode
。其中一个主要的原因,使用此功能,而不是innerHTML
的是,所有的HTML字符转义会照顾你,而你就必须自己逃脱你的字符串,如果你简单地设置innerHTML
。
您可以通过操纵DOM获得同样的效果。更改文本最安全的方式是移除元素的所有子节点,并用新的文本节点替换它们。
var node = document.getElementById("one");
while( node.firstChild )
node.removeChild( node.firstChild );
node.appendChild( document.createTextNode("Two") );
删除子节点用新的文本替换它之前摆脱你的元素的文本内容。
究其原因大多数开发人员避免使用innerHTML的是,通过访问DOM元素是符合标准的。
如果你只是想改变纯文本,再有就是它依赖于标准更快的解决方案:
document.getElementById("one").firstChild.data = "two";
无论如何,请注意innerHTML的将是即将到来的HTML 5标准的一部分。
简单。
与text.innerHTML = 'two'
更换text.firstChild.nodeValue = 'two'
。
var who=document.getElementById('one'), txt='new text';
if(who.innerText) who.innerText=txt;
else if(who.textContent) who.textContent= txt;
这可能是因为innerHTML来你反感,但它在某些情况下(IE),其中的innerHTML或使用appendChild不这样做,像一些表节点,风格和脚本元素的文本和表单字段的值工作的优势
你可以使用DOM如下:
<html>
<body>
<div>before</div>
<script type="text/javascript">
var element = document.getElementsByTagName("div")[0];
alert(element.firstChild.nodeValue);
element.removeChild(element.firstChild);
element.appendChild(document.createTextNode('after'));
alert(element.firstChild.nodeValue);
</script>
</body>
但我觉得很少有人这样做,但使用像jQuery或Prototype或任何其他Javascript框架there,而不是一个框架。这是jQuery的例子:
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
</head>
<body>
<div>before</div>
<script type="text/javascript">
var element = $("div");
alert(element.text());
element.text("after");
alert(element.text());
</script>
</body>
在我看来,该CSS + HTML + JS组合应该达到预期的效果:
.myelement:before {
content: attr(alt);
}
...
<span class='myelement' alt='initial value'></span>
...
element.setAttribute('alt', 'new value');
有谁知道,如果这个工程在实践中?
那么I F我明白你的问题正确的,这应该是一个答案。
var text = document.getElementById("one");
//text.innerHTML = "Two";
text.childNodes[0].nodeValue="two";