“innerText”在 IE 中有效,但在 Firefox 中无效

IT技术 javascript internet-explorer firefox cross-browser
2021-01-11 22:36:15

我有一些适用于 IE 的 JavaScript 代码,其中包含以下内容:

myElement.innerText = "foo";

但是,似乎 'innerText' 属性在 Firefox 中不起作用。是否有一些 Firefox 等价物?或者是否有可以使用的更通用的跨浏览器属性?

6个回答

更新:我写了一篇博文,详细说明了所有差异


Firefox 使用 W3C 标准Node::textContent,但其行为与 MSHTML 的专有行为“略有不同” innerText(前一段时间,Opera 也复制了许多其他 MSHTML 功能)。

首先,textContent空白表示与innerText一个不同其次,更重要的是,textContent 包括所有 SCRIPT 标签内容,而 innerText 不包括。

只是为了让事情更有趣,歌剧院-除了执行标准textContent-决定也添加MSHTML的innerText ,但改变了它作为textContent-即包括脚本内容(事实上,textContentinnerText在Opera似乎产生相同的结果,可能是被刚刚化名为对方) .

textContentNode接口的一部分,而innerText是 的一部分HTMLElement例如,这意味着您可以“检索”textContent但不能innerText从文本节点:

var el = document.createElement('p');
var textNode = document.createTextNode('x');

el.textContent; // ""
el.innerText; // ""

textNode.textContent; // "x"
textNode.innerText; // undefined

最后,Safari 2.x 也有错误的innerText实现。在 Safari 中,innerText仅当元素既不隐藏(通过style.display == "none")也不从文档中孤立时才能正常运行否则,innerText结果为空字符串。

我在玩textContent抽象(为了解决这些缺陷),但结果证明它相当复杂

您最好的选择是首先定义您的确切要求,然后从那里开始。通常可以简单地从innerHTML元素上剥离标签,而不是处理所有可能的textContent/innerText偏差。

当然,另一种可能性是遍历 DOM 树并递归收集文本节点。

Chrome 也支持 innerText,因此似乎 Firefox 是唯一不支持它的主要浏览器。IE 是唯一不支持 textContent 的浏览器。
2021-03-20 22:36:15
对于那些仍然需要支持 IE8 的人,这里有一个非常完整的Node.textContentshim:github.com/usmonster/aight/blob/node-textcontent-shim/js/...(希望很快被包含在aight 中)。
2021-03-20 22:36:15
@mike - 但innerText在 Chrome 中使用似乎慢了 60 倍jsperf.com/text-content/3
2021-03-24 22:36:15
textContent现在 IE9+ 支持,但 Firefox 仍然不支持innerText(尽管他们确实添加outerHTML了几天前引入的 IE )。
2021-04-01 22:36:15

Firefox 使用符合W3C 的 textContent属性。

我猜 Safari 和 Opera 也支持这个属性。

2019 年版本 64 仍不支持 innerText。
2021-03-20 22:36:15
@krillgar 它计划用于 Firefox 45,将于 3 月 8 日当周发布。它已经在当前的测试版中,并且已经在极光中出现了一段时间。这实际上意味着您可以开始开发innerText使用的站点,并期望它在不久的将来可以在所有当前浏览器以及旧 IE 上运行(可能有一些怪癖)。
2021-03-22 22:36:15
@Bob 截至 2016 年 2 月 22 日,它仍然不是。
2021-03-25 22:36:15
FTR:innerText完全不同textContent,而实际上是非常有用的(令人惊讶的从推测IE怪癖...):innerText试图给如何文本是一种近似实际呈现在浏览器中,全然不像textContent,这只是对返回标签-剥离标记源,增加很少的value,甚至是额外的问题(比如单词边界的丢失)。
2021-03-28 22:36:15

如果您只需要设置文本内容而不需要检索,这里有一个简单的 DOM 版本,您可以在任何浏览器上使用;它不需要 IE innerText 扩展或 DOM Level 3 Core textContent 属性。

function setTextContent(element, text) {
    while (element.firstChild!==null)
        element.removeChild(element.firstChild); // remove all existing content
    element.appendChild(document.createTextNode(text));
}
在 Internet Explorer 中,这无法设置脚本标记的文本(我将它们用作模板)。你已经设置了 `scriptTagElement.text = 'my template {{here}}';
2021-03-19 22:36:15
我不得不非常努力地思考为什么你使用循环(!==null顺便说一下,我会完全丢弃循环)而不是仅仅替换循环element.innerHTML=''(它被指定做与循环完全相同的工作,然后我记得.. .: (legacy-)IE 中的表格... ericvasilik.com/2006/07/code-karma.html是否可以建议添加对“隐藏”的简短描述,并且几乎从未记录过createTextNode替换 amp lt 的“副作用”和 gt 到他们各自的 html 字符实体?指向它的确切行为的链接将是伟大的!
2021-03-19 22:36:15
除非 JavaScript 有“!==”运算符,否则我认为第二行中的运算符应该只是“!=”。
2021-03-29 22:36:15
@RexE:JavaScript 确实有一个!==运算符,它是===. ===/使用的类型敏感比较!==通常比松散比较器==/更可取!=
2021-04-07 22:36:15

jQuery提供了.text()一种可以在任何浏览器中使用方法。例如:

$('#myElement').text("Foo");

根据 Prakash K 的回答,Firefox 不支持 innerText 属性。因此,您可以简单地测试用户代理是否支持此属性并按如下方式进行:

function changeText(elem, changeVal) {
    if (typeof elem.textContent !== "undefined") {
        elem.textContent = changeVal;
    } else {
        elem.innerText = changeVal;
    }
}
elem 中的“textContent”会更简单
2021-03-24 22:36:15
if (elem.textContent != null) 也会更容易!
2021-03-24 22:36:15