2011-01-07 7 views
5
<ul> 
    <li class="item-i">AI</li> 
    <li class="item-ii">AII 
    <ul class="level-2"> 
     <li class="item-a">A</li> 
     <li class="item-b">B</li> 
     <li class="item-c">C</li> 
    </ul> 
    </li> 
    <li class="item-iii">III</li> 
</ul> 

Come posso ottenere i valori AI AII A B C III?Ottenere valori di testo di li (senza testo negli elementi nidificati)

Quello che ho provato finora è la seguente:

$(document).ready(function() { 
    $('li').each(function(index) { 
    alert($(this).text()); 
    }); 
}); 

ma non ha dato mi ha richiesto risultati. Quando raggiunge "item-ii" ha dato tutti i risultati.

Voglio articolo uno per uno.

risposta

2
$(function(){ 
    var text = $('li').map(function(){ 
    return $(this).contents().map(function(){ 
     return this.nodeType==3 ? this.nodeValue : ""; 
    }).get().join(''); 
    }).get().join(' '); 
    console.log(text); 
    // AI AII 
    // 
    //  A B C III 
}); 

Il metodo contents() ti dà entrambi i nodi di testo e nodi figlio. I nodi di testo hanno un nodeType di 3. Per meno codice in stile "funzionale", provate questo:

$(function(){ 
    $('li').each(function(){ 
    $(this).contents().each(function(){ 
     if (this.nodeType==3){ 
     console.log(this.nodeValue.replace(/^\s+|\s+$/g,'')); 
     } 
    }); 
    }); 
    // AI 
    // AII 
    // 
    // A 
    // B 
    // C 
    // III 
}); 

Si noti che non v'è ancora un nodo di testo vuoto a causa della marcatura.

-2
<form> 
    <ul>  
    <li class="item-i">AI</li> 
    <li class="item-ii">AII</li> 
    <ul class="level-2"> 
     <li class="item-a">A</li> 
     <li class="item-b">B</li> 
     <li class="item-c">C</li> 
     </ul> 
     <li class="item-iii">III</li> 
    </ul> 
</form> 
+0

Provare questo codice con gli avvisi AI AII A B C III rispettivamente! – coolguy

+2

Separato dai tuoi problemi di formattazione, questo è un codice HTML non valido. L'HTML della domanda originale è sintatticamente valido; il tuo non lo è – Phrogz

1
$(function() { 
    var content = $.map($('ul li').contents(), function(elem, i) { 
    if(elem.nodeType === 3 && $.trim(elem.nodeValue).length) 
     return $.trim(elem.nodeValue); 
    }); 

    alert(content); 
}); 

Ref .: $.map(), $.trim(), .contents()

2

testo() funzione seleziona tutti i nodi all'interno della lista-itme 'item-II'. Poiché è necessario selezionare solo i nodi di testo, utilizzare invece:

$(document).ready(function(){ 
      $('li').each(function(index) { 
    alert($(this).contents().filter(function(){ return this.nodeType==3}).text()); 
    }); 
     }); 
+0

Possiamo usare la stessa riga di codice per aggiornare il testo? – yashgarg1232