Я хотел бы получить все дочерние текстовые узлы элемента в виде коллекции jQuery. Каков наилучший способ сделать это?
источник
Я хотел бы получить все дочерние текстовые узлы элемента в виде коллекции jQuery. Каков наилучший способ сделать это?
У jQuery нет удобной функции для этого. Вам нужно объединить contents()
, что даст только дочерние узлы, но включает в себя текстовые узлы, с find()
, что дает все элементы-потомки, но не текстовые узлы. Вот что я придумала:
var getTextNodesIn = function(el) {
return $(el).find(":not(iframe)").addBack().contents().filter(function() {
return this.nodeType == 3;
});
};
getTextNodesIn(el);
Примечание. Если вы используете jQuery 1.7 или более раннюю версию, приведенный выше код работать не будет. Чтобы это исправить, замените addBack()
на andSelf()
. andSelf()
не рекомендуется в пользу addBack()
версии 1.8.
Это несколько неэффективно по сравнению с чистыми методами DOM и должно включать уродливый обходной путь для перегрузки jQuery его contents()
функции (благодаря @rabidsnail в комментариях за указание на это), так что здесь есть не-jQuery решение, использующее простую рекурсивную функцию. В includeWhitespaceNodes
параметр управляет ли или не пробельные текстовые узлы , входящие в вывод (в JQuery они автоматически отфильтрованы).
Обновление: исправлена ошибка, когда includeWhitespaceNodes ложно.
function getTextNodesIn(node, includeWhitespaceNodes) {
var textNodes = [], nonWhitespaceMatcher = /\S/;
function getTextNodes(node) {
if (node.nodeType == 3) {
if (includeWhitespaceNodes || nonWhitespaceMatcher.test(node.nodeValue)) {
textNodes.push(node);
}
} else {
for (var i = 0, len = node.childNodes.length; i < len; ++i) {
getTextNodes(node.childNodes[i]);
}
}
}
getTextNodes(node);
return textNodes;
}
getTextNodesIn(el);
document.getElementById()
сначала позвонить , если это то, что вы имеете в виду:var div = document.getElementById("foo"); var textNodes = getTextNodesIn(div);
.contents()
anyways подразумевает, что оно будет искать и в iframe. Я не понимаю, как это может быть ошибка.Jauco опубликовал хорошее решение в комментарии, поэтому я копирую его здесь:
источник
источник
jQuery.contents()
может использоваться с,jQuery.filter
чтобы найти все дочерние текстовые узлы. С небольшим поворотом, вы можете также найти текстовые узлы внуков. Рекурсия не требуется:jsFiddle
источник
Я получал много пустых текстовых узлов с принятой функцией фильтра. Если вас интересует только выбор текстовых узлов, которые не содержат пробелов, попробуйте добавить
nodeValue
условие в вашуfilter
функцию, например, просто$.trim(this.nodevalue) !== ''
:http://jsfiddle.net/ptp6m97v/
Или чтобы избежать странных ситуаций, когда содержимое выглядит как пробел, но это не так (например,
­
символ мягкого дефиса , символы новой строки\n
, табуляции и т. Д.), Вы можете попробовать использовать регулярное выражение. Например,\S
будут соответствовать любые непробельные символы:источник
Если вы можете сделать предположение, что все дочерние элементы являются либо узлами элементов, либо текстовыми узлами, то это одно из решений.
Чтобы получить все дочерние текстовые узлы в виде коллекции jquery:
Чтобы получить копию исходного элемента с удаленными нетекстовыми дочерними элементами:
источник
По какой-то причине
contents()
у меня не сработало, поэтому, если у вас это не сработало, вот решение, которое я сделал, я создалjQuery.fn.descendants
с возможностью включать текстовые узлы или нетПрименение
Получить все потомки, включая текстовые узлы и узлы элементов
Получить всех потомков, возвращающих только текстовые узлы
Получить все потомки, возвращающие только узлы элемента
Coffeescript Original :
Падение в версии Javascript
Это кросс-браузер, в
Array.indexOf
код включен небольшой полифил.источник
Также можно сделать так:
Приведенный выше код фильтрует textNodes от прямых дочерних узлов данного элемента.
источник
если вы хотите удалить все теги, попробуйте
функция:
Применение:
источник
Для меня старый добрый
.contents()
показалось способ вернуть текстовые узлы, просто нужно быть осторожным с вашими селекторами, чтобы вы знали, что они будут текстовыми узлами.Например, это обернуло все текстовое содержимое TD в моей таблице
pre
тегами и не было проблем.источник
У меня была та же проблема, и я решил ее:
Код:
Применение:
Это как,
next()
но также возвращает текстовые узлы.источник