Метод jQuery text() не работает с текстовыми узлами

Метод jQuery text() не работает с текстовыми узлами:

$('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() не поддерживает текстовые узлы? Я ожидаю, что этот метод будет использоваться для любого текстового узла, который сможет изменить значение своего узла.

Я совершенно уверен, что для этого есть веская причина, я не могу просто получить ее.


person A. Wolff    schedule 05.12.2015    source источник


Ответы (1)


в чем может быть причина этого?

Потому что это не то, для чего предназначено text. Из документов:

... установить текстовое содержимое совпадающих элементов

(выделено мной)

Почему он не предназначен для этого — вопрос к Джону Резигу и/или текущему набору специалистов по поддержке jQuery, но можно предположить, что если он будет обрабатывать как текстовые узлы, так и элементы, этот метод усложнится. Он должен был бы проверить nodeType и установить nodeValue, если бы это был текстовый узел, или сделать то, что он сейчас делает (я не знаю, делают ли они innerText/textContent или добавляют текстовый узел, вероятно, первый) для элемента.

Большая часть jQuery ориентирована на элементы, игнорируя другие узлы. contents — один из очень немногих методов, работающих на уровне узла.

person T.J. Crowder    schedule 05.12.2015
comment
Разве нельзя просто проверить метод text() для nodetype textNode, а затем использовать nodeValue, чтобы установить текст достаточно просто? - person A. Wolff; 05.12.2015
comment
@ А. Вольф: Да. Что усложняет метод. - person T.J. Crowder; 05.12.2015
comment
Хорошо, я думаю, что это действительно основная причина jQuery is element-centric. Это просто довольно "странно", так как метод под названием text() не работает с текстом. - person A. Wolff; 05.12.2015
comment
@A.Wolff: Если вы хотите пойти по странному пути в отношении jQuery API, вам предстоит долгий путь. ;-) - person T.J. Crowder; 05.12.2015
comment
Самое «странное» то, что геттер text() работает отлично, только сеттер... - person A. Wolff; 05.12.2015
comment
@A.Wolff: Эта часть меня не удивляет, поскольку цель метода - собрать текст набора. text является странным, даже для jQuery API: все остальные методы доступа (val, attr, prop и т. д.) просто берутся из первого элемента в наборе, а text берутся из < i>все элементы в наборе: jsfiddle.net/uozdnb04 Вот что я имею в виду это долгий путь... - person T.J. Crowder; 05.12.2015
comment
Да, я думаю, что аксессор text() должен работать так же, как html() (наиболее подходящее сравнение, которое я могу придумать) - person A. Wolff; 05.12.2015
comment
Спасибо, это соответствующий ответ. Мне всегда приятно читать ваши посты :) - person A. Wolff; 06.12.2015