2012-03-07 34 views
8

Tôi muốn truy xuất một phần tử thẻ nhất định với các thuộc tính của nó từ DOM. Ví dụ, từnhận thẻ mở bao gồm các thuộc tính - outerHTML mà không cần innerHTML

<a href="#" class="class"> 
    link text 
</a> 

Tôi muốn nhận <a href="#" class="class">, tùy chọn với một đóng </a>, hoặc như là một chuỗi hoặc một số đối tượng khác. Theo ý kiến ​​của tôi, điều này sẽ tương tự như việc truy xuất .outerHTML mà không cần .innerHTML.

Cuối cùng, tôi cần điều này để bao bọc một số phần tử khác thông qua jQuery. Tôi đã thử

var elem = $('#some-element').get(0); 
$('#some-other-element').wrap(elem); 

nhưng .get() trả về phần tử DOM bao gồm nội dung của nó. Cũng

var elem = $('#some-element').get(0); 
$('#some-other-element').wrap(elem.tagName).parent().attr(elem.attributes); 

thất bại như elem.attributes trả về một NamedNodeMap mà không làm việc với jQuery attr() và tôi đã không thể chuyển đổi nó. Thừa nhận rằng các ví dụ trên không có ý nghĩa lắm vì chúng cũng sao chép ID không còn là duy nhất của phần tử nữa. Nhưng có cách nào dễ dàng không? Cảm ơn rất nhiều.

+0

Chỉ cần sao chép nút bằng '.clone()', sau đó xóa nó bằng '.html()' và xóa 'id' và bạn muốn gì khác. – kirilloid

+0

$ ("a"). Clone(). Empty(). Attr ("outerHTML"); Để giải quyết vấn đề đầu tiên – Tuscan

+0

Cảm ơn @kirilloid, hãy đoán josh chỉ nhanh hơn;) –

Trả lời

4
var wrapper = $('.class').clone().attr('id','').empty(); 
  • Bạn có thể muốn thay đổi bộ chọn để chính xác hơn phù hợp với <a> yếu tố bạn đang tìm kiếm.
  • clone() tạo bản sao mới của (các) thành phần phù hợp, tùy chọn sao chép trình xử lý sự kiện.
  • Tôi đã sử dụng attr để xóa ID của phần tử sao cho chúng tôi không trùng lặp ID.
  • empty() xóa tất cả các nút con ('innerHTML').
+0

Gotta yêu jquery. –

+0

Tuyệt vời.Cảm ơn rất nhiều, josh :) Mọi lo ngại về việc sử dụng '.clone()'? Một số người nói rằng nó có thể không phải là người biểu diễn, nhưng tôi không thể thấy bất kỳ giải pháp nào khác. –

+0

tôi đoán .clone() isn'e chính xác sao chép toàn bộ đối tượng và một số loại tham chiếu nào tồn tại và nếu chúng ta sử dụng .remove() cho đối tượng nhân bản, nó thực sự loại bỏ đối tượng gốc. Tôi gặp vấn đề này một lần. –

11

Đối với nhân viên của Google trong tương lai, có một cách để làm điều này mà không cần jQuery:

tag = elem.outerHTML.slice(0, elem.outerHTML.indexOf(elem.innerHTML)); 

Kể từ outerHTML chứa thẻ mở theo sau là một tấm gương về những gì innerHTML chứa, chúng ta có thể substring các outerHTML từ 0 (bắt đầu của thẻ mở) đến nơi innerHTML bắt đầu (kết thúc của thẻ mở), và vì innerHTML là một bản sao của outerHTML, ngoại trừ thẻ mở, chỉ có thẻ mở sẽ bị bỏ lại!

một này làm việc với <br> thẻ, <meta> thẻ, và các thẻ trống khác:

tag = elem.innerHTML ? elem.outerHTML.slice(0,elem.outerHTML.indexOf(elem.innerHTML)) : elem.outerHTML; 

Vì innerHTML sẽ có sản phẩm nào trong thẻ tự đóng, và indexOf('') luôn trả về 0, kiểm tra sửa đổi trên cho sự hiện diện của innerHTML trước tiên.

+0

Điều này không làm việc với các phần tử rỗng: document.createElement ("strong"). OuterHTML.slice (0, elem.outerHTML.indexOf (elem.innerHTML)) – Martin

+0

@Martin đặt khai báo 'createElement' của bạn trong một biến gọi là' elem' và sử dụng biểu thức bậc ba tôi đã sử dụng ở trên, nó trả về ''. –

+0

@AaronGillion Tốt bắt. Điều đó có thể được khắc phục bằng cách tìm kiếm '><' nếu innerHTML là một chuỗi rỗng. Điều này làm cho tôi nghĩ về một vấn đề khác, mặc dù: '' xác định chỉ mục sai cho không gian. – MDMower

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