第一种方法不起作用,因为它所做的只是将变量设置为新值,而不是将值写入元素。线
var innerText = d.innerText || d.textContent;
...将变量设置为它找到的文本属性innerText
的值,它不是对实际属性本身的引用。
你必须做分支,例如:
var d = document.getElementById('d');
var msg = "new text";
if ("innerText" in d) {
d.innerText = msg;
}
else {
d.textContent = msg;
}
该功能 - 检测浏览器是否使用innerText
或textContent
通过查找元素上是否存在属性(这就是in
操作员所做的,检查对象是否具有具有给定名称的属性,即使该属性为空白,null
,undefined
等。 )。
你甚至可以为它自己写一个函数:
var setText = (function() {
function setTextInnerText(element, msg) {
element.innerText = msg;
}
function setTextTextContent(element, msg) {
element.textContent = msg;
}
return "innerText" in document.createElement('span') ? setTextInnerText : setTextTextContent;
})();
这会进行一次特征检测,并返回一个函数,任何半体面的引擎都会为您内联。
或者,如果您希望将消息中的 HTML 标记作为标记(而不是文字文本)处理,您可以只使用innerHTML
(跨浏览器一致)。但同样,如果您使用innerHTML
,标记将被处理,这可能不是您想要的。
我发现使用一个好的 JavaScript 库来处理这些浏览器差异(并提供大量有用的进一步功能)很有用,例如jQuery、YUI、Closure或其他几个。显然,没有图书馆就无法做到,这只是站在已经完成大量工作的人们的肩膀上的问题。:-)
在这种情况下,例如,使用 jQuery,上面的代码将是:
$("#d").text("new text");
而已。