2017-03-17 2 views
0

Ich möchte jedes Wort mit Span-Tag innerhalb Absatz umhüllen. Ich habe es erfolgreich gemacht, wenn es keine HTML-Tags innerhalb des Absatzes gibt. Aber wenn der Absatz HTML-Tags enthält, wird es unordentlich.Wrap Wörter innerhalb div mit span (zum Beispiel) -Tag, während der div hat HTML-Tags innerhalb

Hier Beispiel, wenn keine HTML-Tags innerhalb des Absatzes:

$('div').html(function(i, v) { 
 
    return $.trim(v).replace(/(\w+)/g, '<i class="woord">$1</i>'); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div> 
 
    11111 22222 33333 44444 
 
</div>

Aber wenn es HTML-Tags innerhalb des Absatzes, es Chaos wie folgt geht:

$('div').html(function(i, v) { 
 
    return $.trim(v).replace(/(\w+)/g, '<i class="woord">$1</i>'); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div> 
 
    11111 <span>22222 <small>33333</small></span> 44444 
 
</div>

Vielen Dank für DrunkenPoney für den Versuch, das zu implementieren. Er hat am meisten gemacht, aber es hat den inneren Spannweiteninhalt gebrochen.

möchte ich das Ergebnis so sein, wo jedes Wort im Browser erscheinen, mit <i class="woord"> folgend gewickelt werden:

<div> 
    <i>June</i> <span><i>10</i> <i>sssssss</i></span> <i>ggdgfdf</i> 
</div> 

Sein Code Ergebnis der ursprünglichen span Codestruktur wie folgt gebrochen hat:

<div> 
    <i class="woord">11111</i> <i class="woord"><span>22222</span></i> <i class="woord"><small>33333</small></i> <i class="woord">44444</i> 
</div> 

Antwort

0

Es ist wahr, dass Sie alle Textknoten durchlaufen müssen. In jedem Textknoten können Sie einfach alle Wörter mit der gewünschten Zeichenfolge ersetzen. So ist es ziemlich klar über die Idee. Beachten Sie, dass das Suchen/Ersetzen mit Regex gegen HTML-Tags nicht empfohlen wird. Deshalb müssen wir uns mit rohen Textknoten beschäftigen.

Um auch dies bequem mit jQuery zu tun, verwenden wir die replaceWith-Methode, um den Textknoten durch alle zu ersetzen, die vom Regex-Ersatz zurückgegeben werden.

Hier ist die detaillierte Code:

var wrapHtml = function(textNode){ 
       return $(textNode).replaceWith(
            textNode.nodeValue 
              .replace(/\w+/g,"<i class='woord'>$&</i>")); 
       }; 

$("div").contents().each(function(i,e){ 
if(e.nodeType == 1){  
     var elems = []; 
     elems.push(e); 
     while(elems.length > 0){ 
     var ce = elems.pop(); 
     if(ce.nodeType == 1) { 
      $(ce).contents().each(function(j,o){ 
       if(o.nodeType == 1) { 
        elems.push(o); 
        } else { 
        wrapHtml(o); 
        } 
       }); 
     } else { 
       wrapHtml(ce); 
     } 
     }  
    } else { 
     wrapHtml(e); 
    } 
}); 

Demo.

+1

Fantastischer Typ! Das ist etwas Ordentliches und Genaues. Vielen Dank :) Es ist auch etwas anderes in meinen Sinn gekommen, um dieses solide Zeug, das du gemacht hast, zu vervollständigen. Angenommen, ich möchte diese Idee auf verschiedene HTML-Elemente mit unterschiedlichen Wrap-Ersetzungen anwenden, dann muss ich diesen ganzen Codeblock wiederholen und dann 'div' und' 'ändern, oder es gibt eine Möglichkeit, die Idee zu übernehmen, ohne den Code zu wiederholen Block? –

+0

@MoradHamdy Es hängt von der Komplexität Ihrer Logik ab. Wenn Sie nur '' durch ein anderes Element ersetzen wollen, können Sie der Funktion 'wrapHtml' einen weiteren Parameter hinzufügen und dort die' 'ersetzen. Die Eingabe von 'wrapHtml' ist jedoch nur' textNode', also ist alles, was es weiß, 'textNode', wenn Sie meinen, dass Sie einen anderen HTML-Wrapper (anders als' ') auf verschiedene Wörter anwenden müssen, die in *** verschiedenen Elementen enthalten sind *** - dann müssen Sie möglicherweise das übergeordnete Element (mit dem Textknoten) überprüfen, um das entsprechende Tag entsprechend anzuwenden. Ich denke, dass Sie Code in 'wrapHtml' Funktion ändern können – Hopeless

+0

Ich denke, dass mein Kommentar nicht klar war. Ich möchte diesen Code für verschiedene Orte wie diesen mehrmals anwenden: http://codepen.io/moradxd/pen/xqPyya Sie können sehen, dass ich den js-Code dupliziert habe.Gibt es eine Möglichkeit, dies zu implementieren, wie Plugin-Ansatz, wie containerSelector zum Beispiel '.wrap-1', wordTag zum Beispiel' ', wordClass zum Beispiel' .word-1', oder irgendeinen Weg, der die Wiederholung des js-Codes vereinfacht . Wenn das etwas Komplexes für dich ist, dann kein Problem. Ich bin wirklich dankbar für das, was du bisher gemacht hast :) –

Verwandte Themen