2010-06-04 53 views
5

我已經花了兩天時間,所以如果有簡單的答案,我會感到灰心。我試圖在div中的每個字母周圍放置一個span標籤,同時保留其餘標籤不變。使用jQuery:如何將每個字母包裝在標籤中?

<div id="div"> 
    <p> 
     Of course some of the <strong>text is in other tags</strong> and <strong>some 
     is in <em>nested tags</em>, etc.</strong> 
    </p> 
</div> 

我變得非常接近,但最終總是讓我失望。

+0

符合兒童的標籤也應該得到周圍標籤的字母? – 2010-06-04 20:15:38

+5

你爲什麼想這樣做? – aviraldg 2010-06-04 20:16:08

+0

這是不知道嵌套標記,但可能會給一些groudnwork:http://stackoverflow.com/questions/1966476/javascript-process-each-letter-of-text – 2010-06-04 20:16:35

回答

2

我明白了!這可能不是最佳的解決方案,但它的工作原理!還要注意,由於額外的標籤,空白可能會混亂。這也包裝標籤,但也很容易解決。

function wrap(target) { 
    var newtarget = $("<div></div>"); 
    nodes = target.contents().clone(); // the clone is critical! 
    nodes.each(function() { 
     if (this.nodeType == 3) { // text 
      var newhtml = ""; 
      var text = this.wholeText; // maybe "textContent" is better? 
      for (var i=0; i < text.length; i++) { 
       if (text[i] == ' ') newhtml += " "; 
       else newhtml += "<span>" + text[i] + "</span>"; 
      } 
      newtarget.append($(newhtml)); 
     } 
     else { // recursion FTW! 
      $(this).html(wrap($(this))); 
      newtarget.append($(this)); 
     } 
    }); 
    return newtarget.html(); 
} 

用法:

$("#div").html(wrap($("#div"))); 
+0

這似乎不適用於我 - 我可以看到它正確地在調試器中建立newhtml字符串,但是'$(this).html(newhtml)'不會導致輸出的任何更改.. – Ryley 2010-06-04 21:04:25

+0

我修好了!也許更多的人可以設法優化? – Tesserex 2010-06-04 21:23:10

+0

我也只是在保存的jQuery api頁面副本上進行了測試。它花了一秒鐘,但它的工作,頁面外觀沒有改變,一切都完好無損。似乎工作。 – Tesserex 2010-06-04 21:30:02

1
function init(target) { 
var newtarget = $('<div></div>'); 
nodes = target.contents().clone(); // the clone is critical! 
nodes.each(function(i,v) { 
    if (v.nodeType == 3) { // text 
     if($.trim($(this).text()).length>0){ 
      var letters=$(this).text().split(''); 
      for (var j = 0; j < letters.length; j++) { 
       newtarget.append('<span class="letter">'+letters[j]+'</span>') 
      } 
     } 
    } 
    else { // recursion FTW! 
     newtarget.append($(this)); 
     $(this).html(init($(this))); 
    } 
}); 
return newtarget.html(); 
} 

這工作得相當好。然而,也就是(無論如何7),將所有的空間去掉。另外,我應該從函數結尾處的dom中移除newtarget嗎?克隆怎麼樣?應該刪除?

相關問題