2010-11-08 13 views
5

Jak mogę napisać następujące jQuery nie ...jQuery nie w czystym JavaScript

$(".hover").not(".selected"); 

... w czystym JavaScript?

+0

Każdy powód, dla którego nie używasz tylko jQuery lub jakiejś innej struktury? –

+0

ze względu na wydajność ... używamy raphael już – albuvee

+2

Zdaj sobie sprawę, że jQuery jest dość dobrze zoptymalizowany, cokolwiek napiszesz, najprawdopodobniej nie będzie bardziej efektywne. –

Odpowiedz

7
allItems = document.getElementsByTagName('*'); 
goodItems = []; 
for(i=0;i<allItems.length;i++){ 
    if(
     allItems[i].className && 
     (' '+allItems[i].className.replace(/\s+/g, ' ')+' ').indexOf(' '+'hover'+' ') != -1 && 
     (' '+allItems[i].className.replace(/\s+/g, ' ')+' ').indexOf(' '+'selected'+' ') == -1 
    ) 
     goodItems.push(allItems[i]); 
} 

Jeśli potrzebujesz tego rodzaju pozycje Klasa często należy rozważyć zapisywanie ich jako funkcji lub nawet replikowania niektóre z zachowań jQuery, aby móc robić takie rzeczy $(".hover").not(".selected");

+0

'indexOf()' na nie jest dobrym testem na to, czy element ma określoną klasę i da fałszywe alarmy. Na przykład element z 'class =" foo_hover_bar "' zostanie dopasowany przez ten kod. –

+0

@Tim Dobry połów. Dziękuję Ci. Zaktualizowałem kod. –

+0

Nadal jest problem: to nie zadziała w IE <9, w którym tablice nie mają metody 'indexOf()'. –

1

Można również użyć następujących funkcji pobierz elementy według nazwy klasy.

excludeClass jest tutaj opcjonalnym parametrem, ta funkcja będzie nadal działać, jeśli zdefiniujesz tylko parametr includeClass.

function getElementsByClassName(includeClass, excludeClass) { 
    var elements = []; var el = document.getElementsByTagName('*'); 
    var regexp1 = new RegExp("\\b" + includeClass + "\\b"); 
    var regexp2 = new RegExp("\\b" + (excludeClass ? excludeClass : "") + "\\b"); 
    for (var i = 0; i < el.length; i++) { 
     if (regexp1.test(el[i].className) && !regexp2.test(el[i].className)) { elements.push(el[i]); } 
    } 
    return elements; 
} 
4

Następujące będzie działać. Można go zoptymalizować za pomocą natywnej implementacji przeglądarki getElementsByClassName(), gdzie jest obecny w celu filtrowania listy do samych elementów za pomocą klasy "hover".

function hasClass(el, cssClass) { 
    return el.className && new RegExp("(^|\\s)" + cssClass + "(\\s|$)").test(el.className); 
} 

var matchingElements = []; 
var allElements = document.getElementsByTagName("*"); 
for (var i = 0, len = allElements.length, el; i < len; ++i) { 
    el = allElements[i]; 
    if (hasClass(el, "hover") && !hasClass(el, "selected")) { 
     matchingElements.push(el); 
    } 
} 
+1

+1 dla funkcji hasclass – meo

+0

@Alin: To jest w porządku, ponieważ nie dzieli się na wyrażenie regularne. Sprawdza, czy klasa jest albo na początku, albo bezpośrednio poprzedzona jest białą spacją; to, co poprzedza, że ​​biały znak (jeśli jest obecny) jest nieistotny. Logika sprawdzania końca klasy jest podobna. –

+0

Masz rację. Przepraszam. –

Powiązane problemy