2010-09-04 22 views
9

Należy usunąć wszystkie atrybuty ustawione na niektórych elementach (za pomocą wanilowego JS lub jQuery), z wyjątkiem kilku wybranych ręcznie. Powiedzmy, że mam obraz:Usuń wszystkie atrybuty elementu na podstawie białej listy

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

i chcę to w wyniku:

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

Jedynym sposobem mogę myśleć jest .removeAttr() każdego atrybutu. Problem polega jednak na tym, że czasami elementy mają atrybuty, których nie ma w specyfikacji W3C. Chcę usunąć wszystkie pozostałe atrybuty, które nie są umieszczone na białej liście.

jak to zrobić?

Odpowiedz

13

Oto rozwiązanie, które jest iterowane na liście attributes.

mam właściwie tylko ustawiając jego wartość na "" (pusty ciąg znaków), bo z jakiegoś powodu, removeAttribute() zawiedzie, gdy robi się do atrybutu border. Śledztwo ...

Spróbować:

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

idealne! teraz byłoby możliwe utworzenie tablicy lub czegoś z moją białą listą? Jest to trochę niewygodne dla wszystkich, którzy je wymieniają w tej instrukcji if. – meo

+0

@patrick dw: Właśnie wymyśliłem to samo przed zobaczeniem tego i zaktualizowałem do mojej odpowiedzi, ale teraz nie było to potrzebne :) +1 – Sarfraz

+0

Czy nie byłoby lepiej użyć 'attributes [i] .nodeName'. – Sarfraz

0

W zależności od sytuacji można utworzyć nowy element, skopiować atrybuty starego na podstawie białej listy i zastąpić; lub możesz przekształcić go na ciąg znaków HTML i przeanalizować go. Ale są szanse, że jeśli potrzebujesz odkażać elementy z jQuery, robisz coś złego. Co chciałbyś osiągnąć?

+0

podana jest taka: http://www.google.com/reader/shared/meodai i tam jest mój wynik: http://meodai.ch/content_slider/ rzeczą jest tam Wszystkie rodzaje atrybutów na tych elementach, które chcę usunąć. – meo

+0

W takim przypadku, czy nie byłoby lepiej użyć czegoś [reset.css] (http://meyerweb.com/eric/tools/css/reset/) -ish? Istnieje tylko tyle atrybutów CSS, które mogą zakłócić twój układ. – Tgr

+0

to nie tylko układ, ale ważność. A potem masz ten sam problem. Niektóre attr, których ludzie ustawiają, po prostu nie istnieją, więc trudno je zresetować i powiedzieć, jaki wpływ będzie miało na renderowanie strony w przeglądarce – 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> 

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

Spróbuj tutaj: http://jsfiddle.net/drZhu/

1

ja generalnie wolą nie spaść w dół do surowego js DOM, chyba że jest to absolutnie konieczne przy pracy z jQ, więc źle oferuje czyste rozwiązanie jQ:

$('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 jest bardzo praktyczny, ale po prostu użyłbym go, kiedy naprawdę go użyjesz. w tym przypadku na przykład można zastąpić $ .each przez pour javascript "for" i zwiększysz prędkość ... Zwłaszcza w przypadku zadań, w których musisz parsować pliki HTML, które mogą być bardzo długie, może to mieć duże znaczenie. ... ale twoje rozwiązanie jest dla mnie bardzo właściwe +1 – meo

+1

Szybkość dużych zbiorów danych jest w niektórych przypadkach problemem, a jeśli jest to problem, który dyktuje "absolutnie konieczne". ale ogólnie rzecz biorąc zaczynam od interfejsu API jQuery dla rzeczy, a następnie optymalizuję indywidualnie dla każdego przypadku. Używam tej samej praktyki, kiedy używanie ORM jak Doctrine lub Propel (php) robi wszystko domyślnie w agnostycznym interfejsie API, następnie optymalizuję zapytania lub opuszczam do pierwotnego PDO dla każdego przypadku. +1 za przemyślany i dokładny komentarz ... – prodigitalson

Powiązane problemy