2010-09-04 9 views
9

Necesito eliminar todos los atributos establecidos en ciertos elementos (utilizando vainilla JS o jQuery), excepto unos pocos seleccionados manualmente. Digamos que tengo una imagen:Eliminar todos los atributos de un elemento basado en una lista blanca

<img hspace="4" border="1" vspace="4" src="someimage.jpg" alt="somealt" /> 

y quiero esto como resultado:

<img src="someimage.jpg" alt="somealt" /> 

La única manera en que podía pensar es .removeAttr() cada atributo individual. Pero el problema es que algunas veces los elementos tienen atributos que no existen en la especificación W3C. Quiero eliminar todos los demás atributos que no están incluidos en la lista blanca.

¿cómo harías esto?

Respuesta

13

Aquí hay una solución que itera sobre la lista attributes.

que estoy en realidad sólo estableciendo su valor en "" (cadena vacía), porque por alguna razón, removeAttribute() falla cuando se pone al atributo border. Investigando ...

Darle una oportunidad:

var whitelist = ["src","alt"]; 

$('img').each(function() { 
    var attributes = this.attributes; 
    var i = attributes.length; 
    while(i--) { 
     var attr = attributes[i]; 
     if($.inArray(attr.name,whitelist) == -1) 
      this.removeAttributeNode(attr); 
    } 
});​ 
+0

¡perfecto! ahora, ¿sería posible hacer una matriz o algo con mi lista blanca? Es un poco incómodo para todos enumerarlos en esta declaración if. – meo

+0

@patrick DW: Me acabo de descubrir el mismo antes de ver esto y actualizan en mi respuesta, pero no necesita ahora :) 1 – Sarfraz

+0

¿No sería mejor usar 'atributos [i] .nodeName'. – Sarfraz

0

Dependiendo de la situación, puede crear un nuevo elemento, copiar los atributos del antiguo basado en una lista blanca y reemplazar; o podrías transformarlo en una cadena HTML y analizarlo. Pero lo más probable es que, si necesita desinfectar elementos de jQuery, esté haciendo algo mal. ¿Qué te gustaría lograr?

+0

dado es la siguiente: http://www.google.com/reader/shared/meodai y no es mi resultado: http://meodai.ch/content_slider/ la cosa es que no todos los atributos de todas las clases en esos elementos que quiero eliminar – meo

+0

En ese caso, ¿no sería mejor usar algo [reset.css] (http://meyerweb.com/eric/tools/css/reset/) -ish? Solo hay muchos atributos de CSS que pueden alterar su diseño. – Tgr

+0

no es solo sobre el diseño, pero la validez. Y luego tienes el mismo problema. Algunos atributos que la gente establece simplemente no existen, por lo que es difícil restablecerlos y decir qué influencia tendrá en el procesamiento de la página en el navegador – meo

2
<div id="container"><img id="img" hspace="4" border="1" vspace="4" src="someimage.jpg" alt="somealt"> 
</div> 
<textarea rows="15" cols="80" id="dbg"></textarea> 

Y el javascript:

$('#dbg')[0].value += $('#container').html(); 
atts = $("#img")[0].attributes; 
var img = $("#img"); //since it may remove id as well 
for (var i = atts.length - 1; i >= 0; i--) { 
    var name = atts[i].name; 
    if (name != 'src' && name != 'alt') { //you can implement an array or other thing 
     img.removeAttr(name); 
    } 
} 

$('#dbg')[0].value += $('#container').html(); 

Prueba aquí: http://jsfiddle.net/drZhu/

1

general prefiero no desplegable a raw js DOM a menos que sea absolutamente necesario cuando se trabaja con jQ, por lo que ofrecen una solución de jQ pura:

$('img').each(function() { 
    var e = $(this); 
    var whitelist = ['src','title']; 
    $.each(this.attributes, function(attr, value){ 
     if($.inArray(attr, whitelist) == -1) { 
      e.removeAttr(attr); 
     } 
    }); 
}); 
+2

jQuery es muy práctico, pero solo lo usaría cuando lo use realmente. en este caso, por ejemplo, podría reemplazar su $ .each por un pour javascript "for" y mejoraría la velocidad ... Especialmente en tareas donde tiene que analizar archivos html que podrían ser muy largos, podría marcar una gran diferencia. ... pero tu solución es muy apropiada para mí +1 – meo

+1

La velocidad del pozo sobre grandes conjuntos de datos es una preocupación en algunos casos y si es un problema que dictaría "absolutamente necesario". pero en general, empiezo con la API de jQuery para cosas y luego optimizo caso por caso. Utilizo la misma práctica cuando uso un ORM como Doctrine o Propel (php) hago todo en esa API independiente de forma predeterminada, luego optimizo las consultas, o paso a DOP sin procesar caso por caso. +1 para su comentario cuidadoso y preciso ... – prodigitalson

Cuestiones relacionadas