2009-12-08 21 views
27

¿Es posible eliminar todos los atributos a la vez con jQuery?Eliminar todos los atributos

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

a

<img> 

Probé $('img').removeAttr('*'); sin suerte. ¿Nadie?

+0

mala idea, sólo se debe eliminar lo que los atributos que saber, un elemento DOM tiene mucho más atributos que lo que se especifica en la etiqueta de cada uno con su propio defecto o valor calculado – row1

Respuesta

40

Actualización: el método anterior funciona en IE8 pero no en el modo de compatibilidad IE8 y versiones anteriores de IE. Así que aquí es una versión que hace y utiliza jQuery para eliminar los atributos como lo hace un mejor trabajo de la misma:

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

Por supuesto podría make a plug-in fuera de él:

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

y luego hacer:

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

No hay necesidad de un complemento, era el ciclo while que estaba buscando. ¡Gracias! – David

+0

Err, no. Esto no se acerca a una solución funcional para IE. 'removeAttribute' no funciona en absoluto como se espera aquí (pista: ese bucle' while' va a bloquear el pobre navegador para siempre). –

+1

me acabo de enterar de esto: me gustaría poder bloquear IE para siempre en todas las computadoras a la vez, y solo permitir que una pestaña funcione, lo que apunta a la página de descarga de Chrome. ¡Que sería increíble! (y no, no me refiero a permitir IE 9 o 10 - IE 6 era/** todavía es ** ¡tan basura que IE 9 y 10 merecen sufrir!) – ClarkeyBoy

0

No sé exactamente para qué lo está utilizando, pero ¿ha considerado utilizar clases de CSS y cambiarlas? Será menos codificante de tu parte y menos trabajo para el navegador. Probablemente esto no funcione [fácilmente] si está generando algunos de los atributos sobre la marcha como con y altura.

1

Una muy buena razón para hacer esto para etiquetas específicas es limpiar el contenido heredado y también hacer cumplir las normas.

Digamos, por ejemplo, que quería eliminar los atributos heredados o limitar el daño causado por los atributos de etiqueta FONT quitándolos.

He intentado varios métodos para lograr esto y ninguno, incluido el ejemplo anterior, funciona según lo deseado.

Ejemplo 1: Reemplazar todas las etiquetas FONT con el contenido de texto contenido. Esta sería la solución perfecta, pero a partir de v1.6.2 ha dejado de funcionar. :(

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

Ejemplo 2:. Tira de todos los atributos de una etiqueta llamada - por ejemplo FUENTE vez más, esto no funciona, pero estoy seguro de que solía trabajar una vez sobre una versión anterior de 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); 
}); 
}); 
.

Esperando 1.7 que promete incluir un método para eliminar atributos múltiples por nombre

0

Esto eliminará todos los atributos y funcionará para cada tipo de elemento.

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

Esto también elimina enlaces de eventos. –

+0

¿Entonces razonar para votar hacia abajo? –

36

Un método sencillo que no requiere jQuery:

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

El mejor código es el más simple. Sin jQuery, sin variables locales, solo un bucle. ¡Gracias! – StanE

+1

Tenga cuidado si seleccionó un objeto JQuery. Debe convertirlo a htmlElement ([$ elem.get (0)] (https://api.jquery.com/get/)) antes de usar este método. –

3

En lugar de crear una nueva jQuery.fn.removeAttributes (demostrado en la respuesta aceptada) se puede extender .removeAttr() método existente de jQuery por lo que es aceptar parámetros cero a eliminar todos los atributos de cada elemento en un conjunto:

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

Ahora se puede llamar .removeAttr() sin parámetros para eliminar todo att ributes del elemento:

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

Hoy tengo el mismo problema. Creo que va a ser útil para Usted

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