Eliminar todos los atributos de un elemento basado en una lista blanca

Necesito eliminar todos los atributos establecidos en ciertos elementos (usando vanilla JS o jQuery), a excepción de algunos seleccionados manualmente. Digamos que tengo una imagen:

somealt 

Y quiero esto como resultado:

 somealt 

La única forma en la que podría pensar es .removeAttr() cada atributo único. 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 en la lista blanca.

¿Cómo harías esto?

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

En realidad, solo estoy configurando su valor en "" (cadena vacía), porque por alguna razón, removeAttribute() falla cuando llega al atributo de 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); } });​ 
 
somealt

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

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

Por lo general, prefiero no usar el js en bruto DOM a menos que sea absolutamente necesario al trabajar con jQ, por lo que ofreceré la solución 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); } }); }); 

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