2017-03-17 81 views
0

我想用span標記包裹每個單詞。當段落中沒有HTML標籤時,我成功製作了它。但是當段落裏面有HTML標籤時,它會變得很糟糕。用span(例如)標籤包裝div中的單詞,而div中有HTML標籤

這裏例如,當沒有HTML標記是段落內:

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

但是,當有段內的HTML標籤,它會亂如下:

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

感謝DrunkenPoney試圖實現這一點。他做的最多,但它打破了內部跨度的內容。

我想要的結果是這樣的地方出現在瀏覽器中的每一個字要與<i class="woord">包裹如下:

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

他的代碼,結果打破了原有span代碼結構如下:

<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> 

回答

0

的確,您需要遍歷所有文本節點。在每個文本節點中,您可以用所需的字符串替換所有單詞。 所以這個想法很清楚。請注意,不建議使用正則表達式對HTML標籤進行搜索/替換。這就是爲什麼我們需要處理原始文本節點。

此外,爲了方便地使用jQuery來做到這一點,我們使用replaceWith方法就地替換了從正則表達式替換返回的所有文本節點。

下面是詳細的代碼:

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

奇妙的傢伙!這是簡潔而準確的。非常感謝:)另外還有一件事讓我想起了完成這些固體材料。假設我想將這個想法應用於具有不同換行替換的不同HTML元素,那麼我是否必須重複此所有代碼塊,然後更改'div'和'',或者有一些方法可以應用該想法而不重複代碼塊? –

+0

@MoradHamdy這取決於你的邏輯的複雜性。如果您只想用另一個元素替換'',則可以在函數'wrapHtml'中添加一個參數並替換那裏的''。然而'wrapHtml'的輸入只是'textNode',所以它所知道的只是'textNode',如果你的意思是你需要對包含在***不同元素中的不同單詞應用不同的HTML包裝器(除了''') *** - 那麼您可能需要檢查父元素(包含文本節點)以相應地應用相應的標記。我認爲你可以在'wrapHtml'函數中修改代碼 – Hopeless

+0

我認爲我的評論並不清楚。我的意思是多次爲不同的地方應用此代碼,例如:http://codepen.io/moradxd/pen/xqPyya您可以看到我重複了js代碼。有沒有辦法實現這種插件方法,例如傳遞containerSelector,例如'.wrap-1',wordTag例如'',wordClass例如'.word-1',或者你認爲會簡化重複的js代碼。如果這對你來說很複雜,那麼沒問題。我真的很感謝你已經做出了什麼:) –