2014-09-16 15 views
5

Używam metody nextUntil, aby uzyskać wszystkie elementy między dwoma elementami. Ale ta metoda nie obejmuje text nodes na wyjściu. Daje tablicę taką jak [<br>, <br>, <br>]. Jak mogę uzyskać wszystkie rzeczy, w tym węzły tekstowe? Dzięki.Jquery nextUntil include text nodes

Jest to kod 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> 

A to mój głupi js kod:

$('.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

Tylko '.contents()' zwraca węzły tekstowe. –

+0

Jak mogę zmodyfikować kod dla 'treści()'? – doruk

+1

Potencjalna odpowiedź poniżej (Jeśli rozumiem cel poprawnie) –

Odpowiedz

3

Jedynie metoda jQuery .contents() zwraca wszystkie węzły (w tym tekst węzły, zwykle ignorowane).

Więc może coś takiego ?:

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>'); 
    } 
}); 

To po prostu iterację wszystkich węzłów i oparte na fladze rozpoczyna nową kolekcję, lub owija węzły znalezione.

Ostateczna if (open) pozwala na niezamknięty blok spolierowy w obrębie klasy div zaklasyfikowanej jako content.

Uwagi:

  • $() jest pusty kolekcja jQuery (jak pustą tablicę, ale obiektów jQuery)
  • Proponuję użyć styl dla spojlerów i użyć klasy np result.wrapAll('<div class="spoiler"></div>');

np. http://jsfiddle.net/ykv3gf5L/3/

+2

to jest odpowiedź, której szukam, wielkie dzięki :) – doruk