2010-11-08 101 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