Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript document.getElementsByClassName是否比在节点间循环快?_Javascript_Html_Select_Getelementsbytagname_Getelementsbyclassname - Fatal编程技术网

Javascript document.getElementsByClassName是否比在节点间循环快?

Javascript document.getElementsByClassName是否比在节点间循环快?,javascript,html,select,getelementsbytagname,getelementsbyclassname,Javascript,Html,Select,Getelementsbytagname,Getelementsbyclassname,我正在为chrome扩展编写一个脚本,我必须检查某个分区中是否存在某些项目。我站在一个进退两难的境地面前。假设我首先要检查类名,然后检查带有数据ng属性的标记,然后检查直接嵌套在标记中的img。我可以使用以下方法之一: var first = node.getElementsByClassName('classNameOfInterest'); var second = new Array(); var temp = node.getElementsByTagName('a'); for(va

我正在为chrome扩展编写一个脚本,我必须检查某个分区中是否存在某些项目。我站在一个进退两难的境地面前。假设我首先要检查类名,然后检查带有数据ng属性的标记,然后检查直接嵌套在标记中的img。我可以使用以下方法之一:

var first = node.getElementsByClassName('classNameOfInterest');

var second = new Array();
var temp = node.getElementsByTagName('a');
for(var a = 0 ; a < temp.length ; a++){
    if(temp[a].hasAttribute('data-ng')){
        second.push(temp[a]);
    }
}temp = false;

var third = new Array();
temp = node.getElementsByTagName('img');
for(var a = 0 ; a < temp.length ; a++){
    if(temp[a].parentNode.nodeName == 'A'){
        third.push(temp[a]);
    }
}temp = false;
或者通过检查所有可能感兴趣的元素,并立即检查它们的三个条件,如下所示:

var nodes = node.getElementsByTagName("*");
var first = new Array(); var second = first; var third = first;
for(var a = 0 ; a < nodes.length ; a++){
         if(nodes[a].className.match(\b(classNameOfInterest)\b))
             {first.push(nodes[a]);}
    else if(nodes[a].nodeName == 'A' && nodes[a].hasAttribute('data-ng'))
             {second.push(nodes[a]);}
    else if(nodes[a].nodeName == 'IMG' && nodes[a].parentNode.nodeName == 'A');
             {third.push(nodes[a]);}
}

哪种方法更快/更好,为什么?我想制作rational代码;。请帮忙

在jsperf.com上试试。您的节点循环似乎忽略了类是一个以空格分隔的令牌列表。此外,使用document.querySelectorAllI可能会获得更好的结果,我确实可以尝试一下。但我很想得到一个解释。现在有三个条件。但我想知道如果我有15个条件,或者只有1个条件,会发生什么。我宁愿有一个有根据的答案,也不必写两个代码样本,并在每一步都对它们进行测试。哪种方法更好?node.querySelectorAlla.classNameOfInterest[data ng]img非常有用cleaner@Bergi那看起来确实干净多了。但这不是JQuery吗?如果不是,它只是像我们在css中那样使用选择器?如果它像我们在css中那样选择元素,那么在您的示例中,如何选择a标记而不是img标记?因为css没有那个缩写Yes,它确实使用了像jQuery或css这样的选择器,但它是一个:-需要在旧浏览器中填充。选择a标签是指有img子项的标签?您可以选择所有a>img,然后提取.parentNodes