2010-11-08 98 views
5

如何我寫了下面的jQuery的不...jQuery的不是純JavaScript

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

...在純JavaScript?

+0

任何你不只是使用jQuery或其他框架的原因? – 2010-11-08 09:20:11

+0

由於性能...我們使用raphael已經 – albuvee 2010-11-08 09:33:08

+2

認識到jQuery是相當不錯的優化,無論你寫的代碼是最有可能不會更有效。 – 2010-11-08 09:37:45

回答

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

如果你需要這些類型的類選擇的時候,你應該考慮其另存爲功能,甚至複製一些jQuery的行爲才能夠做的東西一樣$(".hover").not(".selected");

+0

'indexOf()'對於元素是否具有特定的類並且會產生誤報不是一個好的測試。例如,具有'class =「foo_hover_bar」'的元素將通過此代碼進行匹配。 – 2010-11-08 10:14:50

+0

@Tim很好。謝謝。我更新了代碼。 – 2010-11-08 10:18:21

+0

仍然存在一個問題:在IE <9中這不適用,其中數組沒有'indexOf()'方法。 – 2010-11-08 10:37:01

1

您還可以使用下面的函數來按類名獲取元素。

excludeClass這裏是一個可選參數,如果你只定義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

以下將工作。它可以通過使用原生瀏覽器實現getElementsByClassName()進行優化,在該實現中,將列表過濾爲僅具有「懸停」類的元素。

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

hasclass功能的+1 – meo 2010-11-08 10:35:47

+0

@Alin:雖然沒關係,因爲它不是在正則表達式上分裂的。它檢查該類是在開始處還是緊接在空白字符前面;該空白字符(如果存在)之前的內容是不相關的。檢查課程結束的邏輯是相似的。 – 2010-11-08 11:51:19

+0

你說得對。抱歉。 – 2010-11-08 11:53:02