Chciałbym uzyskać wszystkie potomne węzły tekstowe elementu, jako kolekcję jQuery. Jak najlepiej to zrobić?
źródło
Chciałbym uzyskać wszystkie potomne węzły tekstowe elementu, jako kolekcję jQuery. Jak najlepiej to zrobić?
jQuery nie ma do tego wygodnej funkcji. Musisz połączyć contents()
, co da tylko węzły potomne, ale zawiera węzły tekstowe, z find()
, co daje wszystkie elementy potomne, ale nie ma węzłów tekstowych. Oto, co wymyśliłem:
var getTextNodesIn = function(el) {
return $(el).find(":not(iframe)").addBack().contents().filter(function() {
return this.nodeType == 3;
});
};
getTextNodesIn(el);
Uwaga: Jeśli używasz jQuery 1.7 lub wcześniejszego, powyższy kod nie będzie działał. Aby rozwiązać ten problem, należy wymienić addBack()
z andSelf()
. andSelf()
jest przestarzałe na korzyść addBack()
od 1.8.
Jest to nieco nieefektywne w porównaniu z czystymi metodami DOM i musi zawierać brzydkie obejście dla przeciążenia contents()
funkcji przez jQuery (dzięki @rabidsnail w komentarzach do zaznaczenia tego), więc tutaj jest rozwiązanie inne niż jQuery wykorzystujące prostą funkcję rekurencyjną. Do includeWhitespaceNodes
kontroli parametrów czy odstępu węzły tekstowe są zawarte w wyjściowym (jQuery automatycznie są odfiltrowane).
Aktualizacja: Naprawiono błąd, gdy parametr includeWhitespaceNodes jest fałszywy.
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()
pierwszy, jeśli o to ci chodzi:var div = document.getElementById("foo"); var textNodes = getTextNodesIn(div);
.contents()
oznacza, że przeszuka również iframe. Nie rozumiem, jak to może być błąd.Jauco opublikował dobre rozwiązanie w komentarzu, więc kopiuję go tutaj:
źródło
źródło
jQuery.contents()
można użyćjQuery.filter
do znalezienia wszystkich potomnych węzłów tekstowych. Przy odrobinie skrętu można również znaleźć wersety tekstowe dla wnuków. Nie wymaga rekurencji:jsFiddle
źródło
Otrzymałem wiele pustych węzłów tekstowych z zaakceptowaną funkcją filtrowania. Jeśli chcesz tylko wybrać węzły tekstowe zawierające spacje, spróbuj dodać funkcję
nodeValue
warunkowąfilter
, na przykład$.trim(this.nodevalue) !== ''
:http://jsfiddle.net/ptp6m97v/
Lub, aby uniknąć dziwnych sytuacji, w których treść wygląda jak biała spacja, ale nie jest (np. Miękki
­
znak łącznika, znaki nowej linii\n
, tabulatory itp.), Możesz spróbować użyć wyrażenia regularnego. Na przykład\S
dopasuje dowolne znaki spoza:źródło
Jeśli możesz założyć, że wszystkie elementy potomne są Węzłami Elementu lub Węzłami Tekstowymi, to jest to jedno rozwiązanie.
Aby uzyskać wszystkie potomne węzły tekstowe jako kolekcję jquery:
Aby uzyskać kopię oryginalnego elementu z usuniętymi dziećmi nietekstowymi:
źródło
Z jakiegoś powodu
contents()
nie działało dla mnie, więc jeśli to nie zadziałało, oto rozwiązanie, które stworzyłemjQuery.fn.descendants
z opcją włączenia węzłów tekstowych lub nieStosowanie
Zdobądź wszystkich potomków, w tym węzły tekstowe i węzły elementów
Zbierz wszystkich potomków zwracających tylko węzły tekstowe
Uzyskaj wszystkich potomków zwracających tylko węzły elementów
Coffeescript Original :
Upuść wersję Javascript
Jest to przeglądarka internetowa, w
Array.indexOf
kodzie znajduje się mała zawartość wypełniająca.źródło
Można to również zrobić w następujący sposób:
Powyższy kod filtruje textNodes z bezpośrednich potomnych węzłów potomnych danego elementu.
źródło
jeśli chcesz usunąć wszystkie tagi, spróbuj tego
funkcjonować:
stosowanie:
źródło
Dla mnie zwyczajnie stary
.contents()
wydawał się działać, aby zwrócić węzły tekstowe, po prostu uważaj na selektory, abyś wiedział, że będą to węzły tekstowe.Na przykład zawinął całą zawartość TD w mojej tabeli
pre
tagami i nie miał problemów.źródło
Miałem ten sam problem i rozwiązałem go za pomocą:
Kod:
Stosowanie:
Jest jak,
next()
ale zwraca również węzły tekstowe.źródło