Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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:来自两个Div ID的元素_Javascript_Getelementbyid_Concat - Fatal编程技术网

Javascript:来自两个Div ID的元素

Javascript:来自两个Div ID的元素,javascript,getelementbyid,concat,Javascript,Getelementbyid,Concat,我需要选择两个不同导航面板中的所有锚元素。最好的方法是什么?有效的和/或高效的 选项1:我可以将每个导航设置为一个类,查找该类,获取该类中每个div内的所有锚 选项2:我可以为每个导航设置一个ID。由于某种原因,我无法从每个div ID中找到两个锚阵列。知道为什么吗,它们是阵列吗?前 <code> var nav = document.getElementById("nav").getElementsByTagName("a"); var subnav = document.getE

我需要选择两个不同导航面板中的所有锚元素。最好的方法是什么?有效的和/或高效的

选项1:我可以将每个导航设置为一个类,查找该类,获取该类中每个div内的所有锚

选项2:我可以为每个导航设置一个ID。由于某种原因,我无法从每个div ID中找到两个锚阵列。知道为什么吗,它们是阵列吗?前

<code>
var nav = document.getElementById("nav").getElementsByTagName("a");
var subnav = document.getElementById("subnav").getElementsByTagName("a");

var allnav = nav.concat(subnav); // Didn't seem to work

// neither did this.  Just seemed to break.     
for(var i=0;i<subnav.length;i++){ 
   nav.push(subnav[i]);
}
</code>
选项3:按ID获取每个div。发送到函数以循环,获取锚,并执行适当的操作

哪一个更快或使用更少的资源,和/或您认为哪一个更易于维护

我知道jQuery有一个很好的方法,但鉴于我的代码段很短,我不希望只为几个小函数添加整个库

谢谢你的帮助

getElementsByTagName返回节点列表。节点列表不是数组

然而,NodeList类似于数组,可以使用toArray将其转换为数组

或者,您可以使用Array.prototype.slice.callnav将节点列表转换为数组

您还可以向两个nav添加一个类锚nav,然后使用querySelectorAll

var anchors=document.querySelectorAllnav.anchor-nav a

你很接近了:

var allnav = []; // initialise allnav as an array

// Store length of NodeList, slight performance boost in some browsers
// and is just neater
for (var i=0, iLen=subnav.length; i<iLen; i++) { 
   allnav.push(subnav[i]);

   // or

   allnav[i] = subnav[i];
}
不要使用Array.prototype.slice.call,因为您不应该像对待原生ECMAScript对象那样对待主机对象,例如,它在IE<9时会失败。任何地方都没有说明主机对象必须像本机ECMA-262对象那样工作,ECMA-262明确表示它们不必这样做


请注意,还有一个集合和一个集合不是相互排斥的,一个a元素可以是锚定、链接或两者兼有。

nav.push.applynav,subnavHey,我被否决了!!呜呼!!我现在真的被带进了混蛋的大厅。对不管是谁做的,我都没有勇气说出他们是谁,所以我很抱歉没有回敬他们。不要像对待本机对象那样对待主机对象,也不要使用..,因为节点列表具有命名属性,不适合复制到像item方法这样的数组。使用for循环和计数器进行迭代。这是我见过的将节点列表转换为数组的最奇怪的方式。事实上,我很确定它不会工作,尽管如果您更改var arr=[];到var arr=Arrayobj.length@RobG:因为数组构造函数(ES5 15.4.1可选)在使用单个整型参数n ES5 15.4.2.2调用时会创建一个长度为n的新数组。该对象有n+1个自己的属性0..n和长度。在arr{if obj.hasOwnPropertyk see下一个注释中,使用hasOwnProperty for var k for in arr{if obj.hasOwnPropertyk see对创建的数组进行for in循环迭代,将产生这些属性,然后他在转换为数组的对象中查找这些属性,并复制到新数组arr.pushobj[k].@RobG:注意,他在obj上做hasown属性,而不是在arr上,但这并不重要,因为obj也有0..n和长度属性。
var slice = document.body instanceof Object ? // IE < 9 has some really weird issues
    Array.prototype.slice : function () {
        for (var array = [], i = 0, l = this.length; i < l; ++i)
            array[i] = this[i];
    };

var nav = slice.call(document.getElementById("nav").getElementsByTagName("a"));
var subnav = slice.call(document.getElementById("subnav").getElementsByTagName("a"));

var allnav = nav.concat(subnav); // Will work now.
nav.push.apply(nav, subnav);
// nav is now the equivalent of allnav
var allnav = []; // initialise allnav as an array

// Store length of NodeList, slight performance boost in some browsers
// and is just neater
for (var i=0, iLen=subnav.length; i<iLen; i++) { 
   allnav.push(subnav[i]);

   // or

   allnav[i] = subnav[i];
}