删除所有属性

IT技术 javascript jquery
2021-01-20 18:54:51

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

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

<img>

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

6个回答

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

while(elem.attributes.length > 0)
    elem.removeAttribute(elem.attributes[0].name);
这是最简单的方法!
2021-03-16 18:54:51
最好的代码是最简单的。没有 jQuery,没有局部变量,只是一个循环。谢谢!
2021-03-29 18:54:51
如果您选择了 JQuery 对象,请务必小心。在使用此方法之前,您需要将其转换为 htmlElement ( $elem.get(0) )。
2021-03-30 18:54:51

更新:之前的方法在 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);
  });
});

当然你可以用它做一个插件

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 个循环(地图和每个循环)有什么用?当需要从大量元素中删除属性时,它的性能效率低下。您可以轻松地将这些组合成一个循环:$.each(this.attributes, function(i, item) { img.removeAttr(item.name) });
2021-03-22 18:54:51
@ZeroGravityChimp 从属性数组的末尾开始循环,以避免由于长度变化而跳过元素: for (var i = this.attributes.length -1; i >= 0 ; i--) { img.removeAttr(this.attributes[i].name); }
2021-03-23 18:54:51
呃,没有。这与 IE 的工作解决方案相去甚远。removeAttribute完全不像您在这里期望的那样工作(提示:该while循环会永远锁定糟糕的浏览器)。
2021-04-05 18:54:51
刚遇到这个 - 我希望你可以一次在所有计算机上永远锁定 IE,并且只允许一个标签工作,它指向 Chrome 下载页面。那将是真棒!(不,我不是说允许 IE 9 或 10 - IE 6 过去/现在仍然如此垃圾,以至于 IE 9 和 10 应该受苦!)
2021-04-10 18:54:51
不需要插件,这是我所追求的 while 循环。谢谢!
2021-04-12 18:54:51

单行,不需要 jQuery:

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

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

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

对特定标签执行此操作的一个很好的理由是清理遗留内容并强制执行标准。

比方说,例如,您想要删除遗留属性,或通过剥离它们来限制由 FONT 标签属性造成的损坏。

我已经尝试了几种方法来实现这一点,但没有一种方法(包括上面的示例)可以按预期工作。

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

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

示例 2:从命名标签中去除所有属性 - 例如 FONT。同样,这无法正常工作,但我确信它曾经在以前的 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,它Promise包含一种按名称删除多个属性的方法。