2014-09-16 24 views
5

Sto usando il metodo nextUntil per ottenere tutto il materiale tra due elementi. Ma questo metodo non include text nodes in uscita. Fornisce una matrice come [<br>, <br>, <br>]. Come posso ottenere tutto, inclusi i nodi di testo? Grazie.Jquery nextUntil include i nodi di testo

Questo è il codice html:

<div class="content" > 
    --- <a class="b" href="/?q=spoiler">spoiler</a> --- 
    <br> 
    <br> 
    dangerous text here 
    <br> 
    --- <a class="b" href="/?q=spoiler">spoiler</a> --- 
    <br> 
    safe text here 
    <br> 
    --- <a class="b" href="/?q=spoiler">spoiler</a> --- 
    <br> 
    <br> 
    dangerous text here 
    <br> 
    --- <a class="b" href="/?q=spoiler">spoiler</a> ---  
</div> 

E questo è il mio codice muto js:

$('.content a:contains("spoiler").b:even').each(function(){ 
    $(this).nextUntil('.content a:contains("spoiler").b') 
      .wrapAll('<div style="border:solid 1px black;"></div>'); 
}); 

jsfiddle: http://jsfiddle.net/Lwk97rvq/1/

+6

Solo '.contents()' restituisce i nodi di testo. –

+0

come posso modificare il codice per 'contents()'? – doruk

+1

Risposta potenziale qui sotto (Se capisco correttamente l'obiettivo) –

risposta

3

Solo il metodo jQuery .contents() restituisce tutti i nodi (testo compreso nodi, normalmente ignorati).

Così forse qualcosa di simile ?:

http://jsfiddle.net/ykv3gf5L/2/

$('.content').each(function() { 
    var open = false; 
    var result = $(); 
    $(this).contents().each(function() { 
     var $this = $(this); 
     if ($this.text() == "spoiler") { 
      if (open) { 
       result.wrapAll('<div style="border:solid 1px black;"></div>'); 
       open = false; 
      } else { 
       result = $(); 
       open = true; 
      } 
     } else { 
      result = result.add($this) 
     } 
    }); 
    if (open) { 
     result.wrapAll('<div style="border:solid 1px black;"></div>'); 
    } 
}); 

Semplicemente iterare tutti i nodi e sulla base di una bandiera inizia una nuova collezione, o avvolge i nodi trovati.

L'ultimo if (open) consente un blocco spogliatore non chiuso all'interno di un div classe content.

Note:

  • $() è un insieme vuoto jQuery (come un array vuoto, ma per gli oggetti jQuery)
  • vi suggerisco di utilizzare uno stile per i vostri spoiler e utilizza una classe per esempio result.wrapAll('<div class="spoiler"></div>');

ad es. http://jsfiddle.net/ykv3gf5L/3/

+2

questa è la risposta che sto cercando, grazie mille :) – doruk