Ich möchte alle untergeordneten Textknoten eines Elements als jQuery-Auflistung erhalten. Was ist der beste Weg das zu tun?
quelle
Ich möchte alle untergeordneten Textknoten eines Elements als jQuery-Auflistung erhalten. Was ist der beste Weg das zu tun?
jQuery hat hierfür keine praktische Funktion. Sie müssen kombinieren contents()
, was nur untergeordnete Knoten find()
ergibt, aber Textknoten enthält, mit , was alle untergeordneten Elemente, aber keine Textknoten ergibt. Folgendes habe ich mir ausgedacht:
var getTextNodesIn = function(el) {
return $(el).find(":not(iframe)").addBack().contents().filter(function() {
return this.nodeType == 3;
});
};
getTextNodesIn(el);
Hinweis: Wenn Sie jQuery 1.7 oder früher verwenden, funktioniert der obige Code nicht. Um dies zu beheben, ersetzen Sie addBack()
durch andSelf()
. andSelf()
wird zugunsten von addBack()
ab 1,8 abgelehnt .
Dies ist im Vergleich zu reinen DOM-Methoden etwas ineffizient und muss eine hässliche Problemumgehung für die Überladung seiner contents()
Funktion durch jQuery enthalten (dank @rabidsnail in den Kommentaren, um darauf hinzuweisen). Daher handelt es sich hier um eine Nicht-jQuery-Lösung, die eine einfache rekursive Funktion verwendet. Der includeWhitespaceNodes
Parameter steuert, ob Whitespace-Textknoten in der Ausgabe enthalten sind oder nicht (in jQuery werden sie automatisch herausgefiltert).
Update: Fehler behoben, wenn includeWhitespaceNodes falsch ist.
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()
zuerst anrufen , wenn Sie das meinen:var div = document.getElementById("foo"); var textNodes = getTextNodesIn(div);
.contents()
sowieso impliziert, dass es auch den Iframe durchsuchen wird. Ich sehe nicht ein, wie es ein Fehler sein könnte.Jauco hat in einem Kommentar eine gute Lösung gepostet, daher kopiere ich sie hier:
quelle
quelle
jQuery.contents()
kann verwendet werdenjQuery.filter
, um alle untergeordneten Textknoten zu finden. Mit einer kleinen Drehung können Sie auch Textknoten für Enkelkinder finden. Keine Rekursion erforderlich:jsFiddle
quelle
Ich habe viele leere Textknoten mit der akzeptierten Filterfunktion erhalten. Wenn Sie nur daran interessiert sind Textknoten in der Auswahl , die kein Leerzeichen enthalten, versuchen , eine Zugabe
nodeValue
bedingte zu Ihrerfilter
Funktion, wie eine einfache$.trim(this.nodevalue) !== ''
:http://jsfiddle.net/ptp6m97v/
Um seltsame Situationen zu vermeiden, in denen der Inhalt wie ein Leerzeichen aussieht, dies jedoch nicht ist (z. B. das weiche Bindestrichzeichen
­
, Zeilenumbrüche\n
, Tabulatoren usw.), können Sie versuchen, einen regulären Ausdruck zu verwenden. Entspricht beispielsweise\S
allen Nicht-Leerzeichen:quelle
Wenn Sie davon ausgehen können, dass alle untergeordneten Elemente entweder Elementknoten oder Textknoten sind, ist dies eine Lösung.
So rufen Sie alle untergeordneten Textknoten als JQuery-Sammlung ab:
So erhalten Sie eine Kopie des Originalelements, bei der nicht untergeordnete Textelemente entfernt wurden:
quelle
Aus irgendeinem Grund
contents()
hat es bei mir nicht funktioniert. Wenn es bei Ihnen nicht funktioniert hat, habe ich eine Lösung erstellt, die ichjQuery.fn.descendants
mit der Option erstellt habe, Textknoten einzuschließen oder nichtVerwendungszweck
Holen Sie sich alle Nachkommen einschließlich Textknoten und Elementknoten
Lassen Sie alle Nachkommen nur Textknoten zurückgeben
Lassen Sie alle Nachkommen nur Elementknoten zurückgeben
Coffeescript Original :
Drop In Javascript Version
Dies ist browserübergreifend, eine kleine
Array.indexOf
Polyfüllung ist im Code enthalten.quelle
Kann auch so gemacht werden:
Der obige Code filtert die textNodes von direkten untergeordneten untergeordneten Knoten eines bestimmten Elements.
quelle
Wenn Sie alle Tags entfernen möchten, versuchen Sie dies
Funktion:
Verwendungszweck:
quelle
Für mich
.contents()
schien einfach alt zu funktionieren, um die Textknoten zurückzugeben. Sie müssen nur vorsichtig mit Ihren Selektoren sein, damit Sie wissen, dass es sich um Textknoten handelt.Dies hat beispielsweise den gesamten Textinhalt der TDs in meiner Tabelle mit
pre
Tags versehen und hatte keine Probleme.quelle
Ich hatte das gleiche Problem und löste es mit:
Code:
Verwendungszweck:
Ist wie, gibt
next()
aber auch die Textknoten zurück.quelle