【问题标题】:jQuery text() method doesn't work on textnodesjQuery text() 方法在文本节点上不起作用
【发布时间】:2016-03-10 06:35:43
【问题描述】:

jQuery text() 方法在 textNodes 上不起作用:

$('div').contents().filter(function(){
  return this.nodeType === 3;
}).text("new text");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div>
   textNode text doesn't change
</div>

我的问题是这可能是什么原因?

这是关于 withespace 文本节点难以处理的问题吗?和/或比只有子节点更深层次的后代文本节点?

我不是问如何更改它,我知道解决方法,但为什么 jq text() 方法不支持文本节点?我希望在能够更改其节点值的任何文本节点上使用此方法。

我很确定这是有充分理由的,我不能只是明白。

【问题讨论】:

    标签: jquery textnode


    【解决方案1】:

    这可能是什么原因?

    因为这不是 text 的设计目的。来自the docs

    ...设置匹配的元素

    的文本内容

    (我的重点)

    为什么它的设计初衷不是为了做到这一点,这是 John Resig 和/或当前 jQuery 维护者的一个问题,但猜测是,让它处理文本节点和元素会使方法。如果它是一个文本节点,它必须检查nodeType 并设置nodeValue,或者做它目前所做的(我不知道他们是做innerText/textContent 还是附加一个文本节点,可能前者)用于一个元素。

    大部分 jQuery 以元素为中心,忽略其他节点。 contents 是极少数适用于节点级别的方法之一。

    【讨论】:

    • 不会只签入text() 方法的nodetype textNode 然后使用nodeValue 来设置文本足够简单吗?
    • @A.Wolff:是的。这使方法复杂化。
    • @A.Wolff:如果您想在 jQuery API 方面走“奇怪”的道路,那么您还有很长的路要走。 ;-)
    • @A.Wolff:这部分并不让我感到惊讶,因为该方法的目的是收集集合的文本。 text 是一个奇怪的方法,即使对于 jQuery API:所有其他访问器方法(valattrprop 等)只是从 first 元素中获取集合,但 text 来自集合中的 所有 元素:jsfiddle.net/uozdnb04 这就是我的意思,它是一条漫长的道路......
    • 谢谢,这是相关的答案。我总是很高兴阅读你的帖子:)