2009-09-25 8 views
5

Im Ben onun çocuklarının metnini almadan iç içe geçmiş bir liste öğesinin metni alacağı nasıl yani merakJQuery ınnertext

Şimdi $ ('# düğüm'). metinle jquery kullanarak
<ul> 
    <li id="node"> 
     I want this 
    <ul> 
     <li> 
      I dont want this 
     </li> 
    </ul> 
    </li> 
</ul> 

() sadece "Ben bunu istiyorum" dizesini istediğim gibi tüm metni alır.

Herhangi bir yardım için teşekkür ederiz.

Şerefe, Chris.

cevap

0

bunun için bir Text Children Plugin var, bu sık sık yapmak isteyeceğiniz şey buysa. Çıkış için de birkaç seçenek sunuyor.

5

şu sana bir düğümün direkt çocuklardır tüm metin düğümlerin bir birleştirilmiş dizesi alacak:

function getChildText(node) { 
    var text = ""; 
    for (var child = node.firstChild; !!child; child = child.nextSibling) { 
    if (child.nodeType === 3) { 
     text += child.nodeValue; 
    } 
    } 
    return text; 
} 

alert(getChildText(document.getElementById("node"))); 
+0

: katılmadan dize/boşluk kırparak değiştirilmesine olanak tanıyacak kadar

$.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 " 

Veya biraz daha sağlam versiyonu:

// 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> 

Ve

daha basit arama yapmak için metin parçalarınızın arasındaki boşluk. – Neall

+0

Bu iyi bir cevaptır, biraz faydası olabilecek olası bir ayar: Bir dizi dizge döndürecekseniz iki avantaj elde edersiniz: ilk olarak potansiyel olarak maliyetli dize birleştirme işlemlerinden kaçınacaksınız ve ikinci olarak arayan kişi kendilerini 'birleştirmek' arayarak ayırıcı seçimi. – OlduwanSteve

+1

@OlduwanSteve: Doğru, dize dizgilemeleri modern tarayıcılarda katılmayı çağırmaktan daha maliyetli olduğunu düşünmüyorum. Ne olursa olsun, çimdiklemek oldukça kolay; Genel yaklaşım ana şeydir. –

10

Tim'in çözümü işe yarayacak. İşaretlemeniz hep bu biçimde sabit ve yalnızca alt öğe metin yukarı o ilk streç okumak gerekir ise, hatta sadece birlikte kaçmak:

node.firstChild.data 
+1

"nodeValue" ("veri" görüldü). Farkın ne olduğunu merak eden herkes için: http://www.mail-archive.com/[email protected]/msg06963.html Bu bağlamda eşdeğerdir. –

4

Bu örnek bütün çocukları almak için .contents() kullanır düğümler (metin düğümleri dahil), daha sonra nodeType temel alınarak her alt düğümün bir dizeye dönüştürülmesi için .map() kullanır. Düğüm bir metin düğümüyse (yani, <li> içinde olmayan metin), nodeValue.

Bu, jQuery kümesini içeren dizeleri döndürür, böylece numaralı telefonu arayabileceğimiz 'standart' dizi nesnesini almak için .get()'u ararız. Ayrıca eklemek isteyebilirsiniz

$.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: '' 
};