Javascript:来自两个Div ID的元素
我需要选择两个不同导航面板中的所有锚元素。最好的方法是什么?有效的和/或高效的 选项1:我可以将每个导航设置为一个类,查找该类,获取该类中每个div内的所有锚 选项2:我可以为每个导航设置一个ID。由于某种原因,我无法从每个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
<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];
}