2013-03-19 18 views
6

Mam niektóre HTML tak:usunięcia lub pusta zawartość pierwiastków

<div>TEXT 
    <span>SPAN</span> 
     <a href="">LINK</a> 
</div> 

Chciałbym usunąć zawartość pierwiastków, zazwyczaj chciałbym zrobić coś takiego:

$('*').empty(); 

lub

$('*').contents().empty(); 

To spowoduje jednak usunięcie/opróżnienie pierwszego zakresu i jego zawartości, która jest div i link. Co mogę zrobić, aby zachować elementy podczas ich opróżniania? Wynik końcowy będzie więc następujący:

<span> 
    <div></div> 
    <a href=""></a> 
</span> 

Uwaga: szukam czegoś "uniwersalnego", które można zastosować do dowolnego kodu HTML. Powyższe jest tylko przykładem, w rzeczywistości struktura HTML zawierałaby więcej danych.

Example at JsFiddle

+0

dodałem link do JsFiddle – Youss

+2

pierwszych rzeczy, umieszczając '' span' div' ciągu nie jest w porządku – thecodeparadox

+1

spojrzenie na http: // stackoverflow .com/questions/298750/how-do-i-select-text-nodes-with-jquery –

Odpowiedz

3

rekurencyjnie pętli wszystkich węzłów i usunąć wszystkie dzieci, których nodeType właściwość jest równa 3 (Node.TEXT_NODE). jQuery nie może wybrać tylko węzłów tekstowych, więc można to zrobić za pomocą wanilii JavaScript.

Przykład:

function removeText(node) { 
    if (!node || !node.childNodes || !node.childNodes.length) return; 
    for (var i=node.childNodes.length-1; i>=0; --i) { 
     var childNode = node.childNodes[i]; 
     if (childNode.nodeType === 3) node.removeChild(childNode); 
     else if (childNode.nodeType === 1) removeText(childNode); 
    } 
} 

Albo, zapakowane w plugin jQuery:

$.fn.removeText = function() { 
    for (var i=this.length-1; i>=0; --i) removeText(this[i]); 
    return this; 
}; 

http://jsfiddle.net/hcKsX/

+0

Nie wydaje się działać w moim przykładzie. – Youss

+1

@Youss Dodałem skrzypce. Wygląda na to, że działa dobrze. Również z twoim przykładem: http://jsfiddle.net/hcKsX/1/ –

+0

+1 Pracowałem dla mnie. Dobre rozwiązanie. –

2

Get dzieciom pozycji dominującej i ustawić ich html jak tak:

$('#myspan').children().html(''); 

jsFiddle

+2

A co z większymi poziomami zagnieżdżania? –

1

Rozwiązania te są w porządku, ale żadna z nich nie spełnia Twojego warunku.

Przykład 1: usunąć tekst wewnątrz węzłów liściowych

$('body *:not(:has(*))').empty() 

Wynik:

<span>SPAN 
    <div></div> 
    <a href=""></a> 
</span> 

Przykład 2: usunąć tekst wewnątrz dzieci jednego węzła

$('body span').children().html('') 

Wynik:

<span>SPAN 
    <div></div> 
    <a href=""></a> 
</span> 

(tak samo jak powyżej). Jednak to rozwiązanie nie zadziałałoby, gdyby istniało więcej niż 2 poziomy zagnieżdżania.

Inne rozwiązania mają podobne upadki.

Prawdziwy problem polega na tym, że nie ma dobrego sposobu na usuwanie tekstu z węzła, który jest jednocześnie węzłem nadrzędnym ORAZ węzłem tekstowym. Powinieneś albo zhakować coś razem, albo ponownie renderować swój widok za każdym razem.

+0

Rozumiem, że bardzo jasne: W tej chwili skrobię aktualności bbc. Korzystanie z kodów w anwsers do tej pory ma wiele "uszkodzeń" struktury HTML – Youss

0

To powinno usunąć wszystkie węzły tekstowe w drzewie DOM:

$('*').contents().filter(
    function() { 
    return this.nodeType == 3; 
}).remove(); 
Powiązane problemy