2009-12-08 69 views
27

Có thể xóa tất cả các thuộc tính cùng một lúc bằng jQuery không?Xóa tất cả các thuộc tính

<img src="example.jpg" width="100" height="100"> 

để

<img> 

tôi đã cố gắng $('img').removeAttr('*'); không có may mắn. Bất kỳ ai?

+0

ý tưởng tồi, bạn chỉ nên dùng loại bỏ những gì thuộc tính bạn biết về, một phần tử DOM có thuộc tính hơn rất nhiều so với những gì bạn chỉ định trong thẻ mỗi với mặc định của mình hoặc giá trị được tính toán. – row1

Trả lời

40

Cập nhật: phương thức trước hoạt động trong IE8 nhưng không ở chế độ tương thích IE8 và các phiên bản trước của IE. Vì vậy, đây là một phiên bản mà không và sử dụng jQuery để loại bỏ các thuộc tính vì nó làm một công việc tốt hơn của nó:

$("img").each(function() { 
    // first copy the attributes to remove 
    // if we don't do this it causes problems 
    // iterating over the array we're removing 
    // elements from 
    var attributes = $.map(this.attributes, function(item) { 
    return item.name; 
    }); 

    // now use jQuery to remove the attributes 
    var img = $(this); 
    $.each(attributes, function(i, item) { 
    img.removeAttr(item); 
    }); 
}); 

Tất nhiên bạn có thể make a plug-in ra khỏi nó:

jQuery.fn.removeAttributes = function() { 
    return this.each(function() { 
    var attributes = $.map(this.attributes, function(item) { 
     return item.name; 
    }); 
    var img = $(this); 
    $.each(attributes, function(i, item) { 
    img.removeAttr(item); 
    }); 
    }); 
} 

và sau đó làm:

$("img").removeAttributes(); 
+0

Không cần plugin, đó là vòng lặp while tôi đã làm sau đó. Cảm ơn! – David

+0

Err, no. Điều này không đến gần với giải pháp làm việc cho IE. 'removeAttribute' không hoạt động như bạn mong đợi ở đây (gợi ý: vòng lặp' while' sẽ khóa trình duyệt nghèo vĩnh viễn). –

+1

chỉ gặp vấn đề này - tôi ước bạn có thể khóa IE vĩnh viễn trên tất cả các máy tính cùng một lúc và chỉ cho phép một tab hoạt động, trỏ đến trang tải xuống Chrome. Điêu đo thật tuyệt vơi! (và không, tôi không có nghĩa là cho phép IE 9 hoặc 10 - IE 6 là/** vẫn là ** vì vậy rác mà IE 9 và 10 xứng đáng phải chịu!) – ClarkeyBoy

0

Tôi không biết chính xác những gì bạn đang sử dụng, nhưng bạn có cân nhắc sử dụng các lớp css thay thế và chuyển đổi chúng không? Nó sẽ ít mã hóa bên bạn và ít hoạt động hơn cho trình duyệt. Điều này có thể sẽ không hoạt động [dễ dàng] nếu bạn đang tạo ra một số thuộc tính trên bay như với và chiều cao.

1

Một lý do rất tốt để làm điều này cho các thẻ cụ thể là xóa nội dung cũ và cũng thực thi các tiêu chuẩn. Ví dụ:

Ví dụ: bạn muốn xóa thuộc tính cũ hoặc giới hạn thiệt hại do thuộc tính thẻ FONT gây ra bằng cách xóa chúng.

Tôi đã thử một số phương pháp để đạt được điều này và không có, bao gồm ví dụ ở trên, hoạt động như mong muốn.

Ví dụ 1: Thay thế tất cả các thẻ FONT bằng nội dung văn bản có chứa. Đây sẽ là giải pháp hoàn hảo nhưng tính năng v1.6.2 đã ngừng hoạt động. :(

$('#content font').each(function(i) { 
    $(this).replaceWith($(this).text()); 
}); 

Ví dụ 2:. Strip tất cả các thuộc tính từ một thẻ tên - ví dụ FONT Một lần nữa, điều này không có chức năng nhưng chắc chắn nó được sử dụng để làm việc một lần khi một phiên bản jQuery trước

$("font").each(function() { 
// First copy the attributes to remove. 
var attributes = $.map(this.attributes, function(item) { 
    return item.name; 
});  
// Now remove the attributes 
var font = $(this); 
$.each(attributes, function(i, item) { 
    $("font").removeAttr(item); 
}); 
}); 
.

Nhìn về phía trước 1,7, hứa hẹn sẽ bao gồm một phương pháp để loại bỏ nhiều thuộc tính theo tên

0

Điều này sẽ loại bỏ tất cả các thuộc tính và nó sẽ hoạt động cho mọi loại phần tử.

var x = document.createElement($("#some_id").prop("tagName")); 
    $(x).insertAfter($("#some_id")); 
    $("#some_id").remove(); 
+2

Điều này cũng loại bỏ các ràng buộc sự kiện. –

+0

Sau đó, lý do bỏ phiếu xuống? –

36

Một phương pháp đơn giản mà không đòi hỏi JQuery:

while(elem.attributes.length > 0) 
    elem.removeAttribute(elem.attributes[0].name); 
+1

Mã tốt nhất là mã đơn giản nhất. Không có jQuery, không có biến cục bộ, chỉ là một vòng lặp. Cảm ơn! – StanE

+1

Hãy cẩn thận nếu bạn đã chọn một đối tượng JQuery. Bạn cần chuyển đổi nó thành htmlElement ([$ elem.get (0)] (https://api.jquery.com/get/)) trước khi sử dụng phương thức này. –

3

Thay vì tạo ra một mới jQuery.fn.removeAttributes (thể hiện trong câu trả lời được chấp nhận), bạn có thể mở rộng .removeAttr() phương pháp hiện có của jQuery làm cho nó chấp nhận không tham số để xóa tất cả các thuộc tính khỏi từng phần tử trong một tập hợp:

var removeAttr = jQuery.fn.removeAttr; 
jQuery.fn.removeAttr = function() { 

    if (!arguments.length) { 
    this.each(function() { 

     // Looping attributes array in reverse direction 
     // to avoid skipping items due to the changing length 
     // when removing them on every iteration. 
     for (var i = this.attributes.length -1; i >= 0 ; i--) { 
     jQuery(this).removeAttr(this.attributes[i].name); 
     } 
    }); 

    return this; 
    } 

    return removeAttr.apply(this, arguments); 
}; 

Bây giờ bạn có thể gọi .removeAttr() mà không có thông số để xóa tất cả sườn từ phần tử:

$('img').removeAttr(); 
0

Hôm nay tôi có cùng một vấn đề. Tôi nghĩ rằng nó sẽ hữu ích cho bạn

var clone = $(node).html(); 
clone = $('<tr>'+ clone +'</tr>'); 
clone.addClass('tmcRow'); 
Các vấn đề liên quan