2009-09-02 35 views
5

Nếu tôi có một số HTML trông như thế này:Remove thẻ xung quanh một nút văn bản sử dụng javascript

<div id="text"> 
     This is some text that is being written <span class="highlight">with 
     a highlighted section</span> and some text following it. 
</div> 

Và tôi muốn loại bỏ các "nhịp cầu" giữ nút văn bản trong thời hạn, làm thế nào tôi sẽ đi về làm điều đó ? Tôi đã thử sử dụng jQuery để thực hiện các thao tác sau:

wrap = $('.highlight'); 
wrap.children().insertBefore(wrap); 
wrap.remove(); 

Nhưng điều đó không có tác dụng. Tôi đoán vì trẻ em trả về bộ trống vì chỉ có nút văn bản trong đó. Vì vậy, tất cả những gì xảy ra là khoảng và nội dung của nó được loại bỏ.

Tôi cũng mở để lựa chọn thay thế cho cách tiếp cận của mình tại đây. Điều đang xảy ra là mã của tôi thực sự tạo ra khoảng thời gian đó khi người dùng chọn một khối văn bản. Nó kết thúc tốt đẹp văn bản được chọn trong một khoảng để phân biệt bằng mắt nó. Tôi cần phải loại bỏ các span sau đó mặc dù vì một số quirks với cách đối tượng phạm vi của mozilla hoạt động.

EDIT: Tôi không muốn thay thế toàn bộ nội dung của '#text' bằng cách này vì nó có thể rất lớn.

Trả lời

18

Bạn nhận được các văn bản, và thay thế khoảng với nó:

var wrap = $('.highlight'); 
var text = wrap.text(); 
wrap.replaceWith(text); 
0

văn bản.replace (/ < /? [^>] + (> | $)/G, "");

+0

Ah, biểu thức thông thường. Tôi chưa bao giờ gặp một thứ khiến não tôi không khóc. Nhưng đây là một cách tiếp cận tốt. Chỉ cần thay thế html bên trong bằng kết quả của một regex. Tôi thích nó. – Karim

+0

Tốt nhất là không bao giờ sử dụng regex cho (X) (HT) ML vì đây không phải là ngôn ngữ thông thường. tuy nhiên trong trường hợp này, điều trên sẽ hoạt động. –

+0

-1 Điều này loại bỏ các thẻ, nhưng không theo cách OP được chỉ định. – Imagist

3

này hoạt động:

wrap = $('.highlight'); 
wrap.before(wrap.text()); 
wrap.remove(); 
+0

Lý do cho phiếu giảm giá? Tôi đã thử nghiệm điều này trên Google AJAX Playground cho jQuery và nó đã hoạt động ... –

+0

+1 - nó thực sự hoạt động - bấm vào tab đầu ra - http://jsbin.com/iqola/edit –

3

này sẽ làm những gì bạn muốn, và cũng có thể bảo vệ bất kỳ thẻ trong khoảng .highlight .

content = $(".highlight").contents(); 
$(".highlight").replaceWith(content); 
0

nó sẽ dễ dàng hơn nhiều khi chỉ thay đổi lớp của khoảng hơn là thực sự loại bỏ nó. Bạn có thể sử dụng javascript tinh khiết: toggleClass chức năng

document.getElementById("span id").className=""; 

Hoặc jquery của:

$("element").toggleClass("highlight"); 

Ngoài ra, thực hành tốt nhất nói rằng bạn không nên sử dụng tên lớp ngụ ý một phong cách, giống như điểm nhấn. Thay vào đó, hãy thử "nhấn mạnh". : D

+0

vâng, đáng buồn là khoảng thời gian phải là loại bỏ do sự kỳ quặc với đối tượng phạm vi tôi đã đề cập. – Karim

6

bọc nó trong một plugin

(function($) { 
    $.fn.tagRemover = function() {   
     return this.each(function() {    
     var $this = $(this); 
     var text = $this.text(); 
     $this.replaceWith(text);    
     });    
    }  
})(jQuery); 

và sau đó sử dụng như vậy

$('div span').tagRemover(); 

Working Demo đây - thêm /chỉnh sửa vào URL để chơi với mã

+0

Nói về việc đi thêm dặm ... tốt đẹp. – Karim

+0

Đưa nội dung vào một plugin hầu như luôn là một động thái tốt (và bây giờ là) +1 –

-1

Plugin unwrap tốt hơn:

$.fn.unwrap = function() { 
    this.parent(':not(body)') 
    .each(function(){ 
     $(this).replaceWith(this.childNodes); 
    }); 

    return this; 
}; 

từ Ben Alman

1
element = document.getElementById("span id"); 
element.parentNode.insertBefore(element.firstChild, element); 
element.parentNode.removeChild(element); 
Các vấn đề liên quan