Dieses Beispiel .contents()
nutzt alle Kinder zu bekommen Knoten (einschließlich Textknoten) und verwendet dann .map()
, um jeden untergeordneten Knoten basierend auf der nodeType
in eine Zeichenfolge umzuwandeln. Wenn der Knoten ein Textknoten ist (d. H. Text nicht innerhalb der <li>
), geben wir nodeValue
zurück.
Dies gibt einen jQuery-Satz zurück, der Strings enthält, also rufen wir .get()
auf, um ein 'Standard'-Array-Objekt zu erhalten, das wir .join()
aufrufen können.
// our 'div' that contains your code:
var $html = $('<li id="node">I want this<ul><li>I dont want this</li></ul> </li>');
// Map the contents() into strings
$html.contents().map(function() {
// if the node is a textNode, use its nodeValue, otherwise empty string
return this.nodeType == 3 ? this.nodeValue : undefined;
// get the array, and join it together:
}).get().join('');
// "I want this " -- note the extra whitespace from after the <ul>
Und ein einfacher Anruf zu machen:
$.fn.directText=function(delim) {
if (!delim) delim = '';
return this.contents().map(function() { return this.nodeType == 3 ? this.nodeValue : undefined}).get().join(delim);
};
$html.directText();
// "I want this "
Oder eine etwas robustere Version Leerzeichen/Ändern der Verbindungszeichenfolge zu ermöglichen Besatz:
$.fn.directText = function(settings) {
settings = $.extend({},$.fn.directText.defaults, settings);
return this.contents().map(function() {
if (this.nodeType != 3) return undefined; // remove non-text nodes
var value = this.nodeValue;
if (settings.trim) value = $.trim(value);
if (!value.length) return undefined; // remove zero-length text nodes
return value;
}).get().join(settings.joinText);
};
$.fn.directText.defaults = {
trim: true,
joinText: ''
};
Sie könnten auch ein einfügen möchten Platz zwischen Ihren Textstücken. – Neall
Dies ist eine gute Antwort, nur eine mögliche Optimierung, die einigen nutzen könnte: Wenn Sie ein Array von Strings zurückgeben würden, würden Sie zwei Vorteile erhalten: Erstens würden Sie die potenziell kostspieligen String-Verkettungen vermeiden und zweitens würde der Aufrufer ein Wahl des Separators durch Aufruf von "Join". – OlduwanSteve
@OlduwanSteve: True, obwohl ich glaube nicht, String-Verkettungen sind teurer als Aufruf in modernen Browsern beizutreten. Egal, es ist ziemlich einfach zu optimieren; Der allgemeine Ansatz ist die Hauptsache. –