tym przykładzie użyto .contents()
aby wszystkie dzieci węzły (w tym węzły tekstowe), a następnie używa .map()
, aby przekształcić każdy węzeł podrzędny w ciąg znaków na podstawie nodeType
. Jeśli węzeł jest węzłem tekstowym (tj. Tekstem nie mieszczącym się w zakresie <li>
), zwracamy jego numer nodeValue
.
Zwraca zestaw jQuery zawierający ciągi znaków, dlatego wywołujemy .get()
, aby uzyskać "standardowy" obiekt tablicy, który możemy nazwać .join()
na.
// 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>
I aby prostszy połączenia:
$.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 "
lub nieco bardziej wytrzymałe wykonanie, aby umożliwić przycinanie spacje/wymiana łańcuch łączący:
$.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: ''
};
kupili także aby wstawić przestrzeń między fragmentami tekstu. – Neall
To jest dobra odpowiedź, tylko możliwe modyfikacje, które mogą przynieść korzyść: jeśli zwrócisz tablicę ciągów, otrzymasz dwie korzyści: po pierwsze unikniesz potencjalnie kosztownych połączeń ciągów, a po drugie, dzwoniący otrzyma wybór separatora przez wywołanie "join". – OlduwanSteve
@OlduwanSteve: To prawda, chociaż nie sądzę, aby konkatenacje ciągów były droższe niż wywoływanie połączeń w nowoczesnych przeglądarkach. Bez względu na to, łatwo jest poprawić; ogólne podejście jest najważniejsze. –