删除所有属性

时间:2009-12-08 22:48:19

标签: javascript jquery

是否可以使用jQuery一次删除所有属性?

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

<img>

我试了$('img').removeAttr('*');没有运气。任何人吗?

10 个答案:

答案 0 :(得分:54)

一个不需要JQuery的简单方法:

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

答案 1 :(得分:47)

更新:以前的方法适用于IE8,但不适用于IE8兼容模式和以前版本的IE。所以这里有一个版本,它使用jQuery删除属性,因为它可以更好地完成它:

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

当然你可以make a plug-in出来:

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

然后执行:

$("img").removeAttributes();

答案 2 :(得分:4)

您可以扩展jQuery的现有.removeAttr()方法,使其接受零参数,从而删除集合中每个元素的所有属性,而不是创建新的jQuery.fn.removeAttributes(在接受的答案中演示):

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

现在,您可以调用不带参数的.removeAttr()来删除元素中的所有属性:

$('img').removeAttr();

答案 3 :(得分:3)

单线,无需jQuery:

[...elem.attributes].forEach(attr => elem.removeAttribute(attr.name));

答案 4 :(得分:1)

为特定标签执行此操作的一个非常好的理由是清理旧内容并执行标准。

例如,假设您要删除旧版属性,或者通过剥离它们来限制FONT标记属性造成的损坏。

我已经尝试了几种方法来实现这一点,并且没有一种方法(包括上面的示例)可以按需运行。

示例1:将所有FONT标记替换为包含的文本内容。 这将是完美的解决方案,但从v1.6.2起已经停止运作。 :(

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

示例2:从命名标记中删除所有属性 - 例如字体。 同样,这无法正常运行,但我确定它曾经用于以前的jQuery版本。

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

期待1.7承诺包含一个按名称删除多个属性的方法。

答案 5 :(得分:0)

我不知道你正在使用它的确切内容,但你是否考虑过使用css类并切换它们?它将减少您的编码,减少浏览器的工作量。如果您正在使用和高度生成一些属性,那么这可能不会[轻松]工作。

答案 6 :(得分:0)

这将删除所有属性,它将适用于每种类型的元素。

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

答案 7 :(得分:0)

今天我有同样的问题。我认为这对你有用

var clone = $(node).html();
clone = $('<tr>'+ clone +'</tr>');
clone.addClass('tmcRow');

答案 8 :(得分:0)

单线。

对于jQuery用户

$('img').removeAttr(Object.values($('img').get(0).attributes).map(attr => attr.name).join(' '));

答案 9 :(得分:0)

现在不需要将属性名称引用到 id,因为我们有 removeAttributeNode 方法。

while(elem.attributes.length > 0) {
    elem.removeAttributeNode(elem.attributes[0]);
}