2010-11-08 20 views
5
yılında

nasıl saf JavaScript ... ...jQuery değil saf JavaScript

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

aşağıdaki jQuery değil yazabilirim? sınıf seçimleri bu tür gerekiyorsa

+0

JQuery'yi veya başka bir çerçeveyi neden kullanmıyorsunuz? –

+0

performans nedeniyle… raphael'i zaten kullanıyoruz – albuvee

+2

jQuery'nin oldukça iyi bir şekilde optimize edildiğini fark edersiniz, yazdığınız kod büyük olasılıkla daha verimli olmayacaktır. –

cevap

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

sıklıkla Ayrıca çalışması için aşağıdaki kullanabilirsiniz fonksiyonları olarak kaydederek hatta jQuery davranış bazı $(".hover").not(".selected");

+0

'indexOf()', bir öğenin belirli bir sınıfa sahip olup olmadığına ve yanlış pozitif sonuç vereceğine dair iyi bir test değildir. Örneğin, class = "foo_hover_bar" 'olan bir öğe bu kodla eşleşecektir. –

+0

@Tim İyi yakalama. Teşekkür ederim. Kodu güncelledim. –

+0

Hala bir sorun var: Bu, dizilerin

1

gibi şeyler yapabilmek için kopyalayan düşünmelisiniz öğeleri sınıf adına göre al.

excludeClass isteğe bağlı bir parametredir, bu işlev yalnızca includeClass parametresini tanımladığınızda çalışmaya devam edecektir.

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

Aşağıdakiler işe yarar. Listenin sadece "vurgulu" sınıfına sahip öğelere filtre uygulanabilmesi için mevcut bir yerel tarayıcı uygulaması olan getElementsByClassName() kullanılarak optimize edilebilir.

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 – meo

+0

@Alin: Sorun değil, çünkü normal ifadede ayrılmıyor. Sınıfın başlangıçta ya da hemen önce bir boşluk karakteriyle olduğunu kontrol eder; Bu boşluk karakterinin (varsa) neyin önemi yoktur. Sınıfın sonunu kontrol etmek için mantık benzerdir. –

+0

Haklısınız. Afedersiniz. –