2010-06-04 25 views
5

Tôi đã dành hai ngày về điều này, vì vậy tôi sẽ chán nản nếu có một câu trả lời đơn giản. Tôi đang cố gắng để đặt một thẻ span xung quanh mỗi chữ cái trong một div, trong khi rời khỏi phần còn lại của các thẻ còn nguyên vẹn.Sử dụng jQuery: Làm thế nào để bạn quấn từng chữ cái trong một thẻ?

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

Tôi nhận được rất gần, nhưng một cái gì đó luôn luôn đi tôi cuối cùng.

+0

Are các chữ cái trong các thẻ con cũng phải có được một thẻ xung quanh ? –

+5

Tại sao bạn muốn làm điều này? – aviraldg

+0

Điều này không nhận thức được các thẻ lồng nhau nhưng có thể cung cấp cho một số groudnwork: http://stackoverflow.com/questions/1966476/javascript-process-each-letter-of-text –

Trả lời

2

Tôi hiểu rồi! Đây có thể không phải là giải pháp tối ưu, nhưng nó hoạt động! Cũng lưu ý rằng vì các thẻ phụ, khoảng trắng có thể bị rối tung lên. Điều này cũng kết thúc tốt đẹp các tab nhưng điều đó cũng dễ sửa.

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

Cách sử dụng:

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

Điều này dường như không làm việc cho tôi - tôi có thể thấy rằng nó chính xác xây dựng chuỗi newhtml trong trình gỡ rối, nhưng '$ (this) .html (newhtml)' không dẫn đến bất kỳ thay đổi nào đối với đầu ra .. – Ryley

+0

Tôi đã sửa nó! Có lẽ nhiều người hơn có thể tìm cách để tối ưu hóa? – Tesserex

+0

Tôi cũng chỉ thử nghiệm nó trên một bản sao lưu của trang api jQuery. Phải mất một giây, nhưng nó đã làm việc, sự xuất hiện trang đã không thay đổi, mọi thứ vẫn còn nguyên vẹn. Dường như làm việc. – Tesserex

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

này hoạt động khá tốt. Tuy nhiên, tức là (7 anyway), dải ra tất cả các không gian. Ngoài ra, tôi nên loại bỏ newtarget từ dom ở phần cuối của hàm? Và những gì về bản sao? Điều đó có nên được loại bỏ không?

Các vấn đề liên quan