Javascript-将多个节点列表连接在一起

Javascript-将多个节点列表连接在一起,javascript,internet-explorer,concat,nodelist,Javascript,Internet Explorer,Concat,Nodelist,我最初要求提供一种优雅的方式,在IE或旧浏览器中模拟getElementsByTagName函数的结果上的Array.concat()功能,因为似乎不支持concat。当然,这只是因为返回的对象不支持它,因为它不是数组。哎呀 getElementsByTagName实际上返回一个NodeList。那么,真正的问题是:有什么好方法可以让文档中所有表单元素(输入、选择、文本区域、按钮)的单个列表循环通过它们?不需要数组。。。一个节点列表也很完美 请注意,我使用的是IE6,因为这是用于公司内部网的(不

我最初要求提供一种优雅的方式,在IE或旧浏览器中模拟
getElementsByTagName
函数的结果上的
Array.concat()
功能,因为似乎不支持
concat
。当然,这只是因为返回的对象不支持它,因为它不是
数组。哎呀

getElementsByTagName
实际上返回一个
NodeList
。那么,真正的问题是:有什么好方法可以让文档中所有表单元素(输入、选择、文本区域、按钮)的单个列表循环通过它们?不需要数组。。。一个
节点列表也很完美

请注意,我使用的是IE6,因为这是用于公司内部网的(不过很快就是IE8)

我得出的答案是:

  • 只需将代码放入一个单独的函数中,并使用不同的节点列表调用三次,而不必担心将它们塞进一个函数中的好方法,这样会变得更简单,性能也可能更好

  • 我最终转向使用MooTools(在几个小时阅读了所有不同框架的比较之后)。所以现在,获取我想要的项目数组非常简单。我建议使用像这样的javascript框架,而不是人们绞尽脑汁试图找出最好的方法。当然,我完全支持学习原始语言(这就是为什么我这么长时间没有使用框架的原因),但这并不总是最快的方法,在商业中,这通常与提高编码人员的语言能力同等重要


更新:差不多2年后,我将只使用jQuery并完成它

要连接节点列表,请使用
Array.prototype.slice.call
将它们转换为数组,然后正常连接它们

var a = Array.prototype.slice.call(document.getElementsByTagName("p")),
    b = Array.prototype.slice.call(document.getElementsByTagName("div"))

var c = a.concat(b);
编辑:(回应您的评论)

如果只有几种类型的元素,这是可以的,但是性能会随着DOM调用的次数而降低。创建一个
文档可能更好更快。getElementsByTagName('*')
,在列表中循环并选择具有所需
节点名的元素

另一件需要记住的事情是,上面使用的
Array.prototype.slice
方法可能不适用于所有浏览器。查看(jQuery后面的选择器引擎)中的注释起始行#723

当然,最好使用像jQuery这样的库来处理所有令人头痛的问题。您可以简单地执行以下操作:

$("input, select, textarea, <other tags>")
$(“输入,选择,文本区域,”)

console.log(合并节点列表(输入、选择));//=>[输入,选择]

我本以为会有更多的答案,但无论如何,我尝试了一下,并想出了以下函数,尽管我不得不猛击一下脑袋

function group_elements(element, tags) {
   var elements = element.getElementsByTagName('*');
   var results  = [];
   for ( var i = 0; i < elements.length; ++i ) {
      if ( tags.indexOf(elements[i].nodeName.toLowerCase()) > -1 ) {
         results.push(elements[i]);
      }
   }
   return results;
}


var form  = document.getElementById('form');
var tags = ['input', 'select'];
console.log(group_elements(form, tags));
功能组\u元素(元素、标签){
var elements=element.getElementsByTagName('*');
var结果=[];
对于(变量i=0;i-1){
结果:推(元素[i]);
}
}
返回结果;
}
var form=document.getElementById('form');
变量标记=['input','select'];
日志(组元素(表单、标签));
使用您可以

let arr = [...nodeList1, ...nodeList2];

如中所述,您还可以使用将中的节点列表转换为支持它的浏览器上的数组。

IE支持这一点,您能稍微澄清一下这个问题吗?使用jQuery绝对是一种方法。不过,我在一个无法访问jQuery的案例中遇到了这个问题。我最终创建了一个元素标记数组,并在其中循环,为每个元素标记调用getElementsByTagName。我想知道这是否比最上面的答案更有效。@bpscott但您是在任何时候将所有元素放在一个数组中,还是一次只处理一个标记?我只是在寻找一种简单的方法来获取多个元素的列表(在本例中,表单元素输入、选择、文本区域,以及可能的按钮)。这是最好的方式吗?我想是时候开始一个新问题了。文档需要引号。getElementsByTagName(“*”)调用,而nodeName是要查找的对象。请记住,这会将nodelist变成一个数组,其中可能没有您需要的可用方法,例如nodeName.valueI我真的看不出这会给所选答案增加更多内容。谢谢你的参与!问题:不要使用字符串,使用数组:
var节点=['input','select']则无需拆分。不要修改参数。重新定义参数是毫无意义的<代码>节点
不是一个好名称,请尝试使用标记名(它们是字符串,不是节点对象)。JavaScript习惯性地使用camelCase,因此
selected_元素
应该是
selectedElements
。我昨天刚刚想到了这一点!
function group_elements(element, tags) {
   var elements = element.getElementsByTagName('*');
   var results  = [];
   for ( var i = 0; i < elements.length; ++i ) {
      if ( tags.indexOf(elements[i].nodeName.toLowerCase()) > -1 ) {
         results.push(elements[i]);
      }
   }
   return results;
}


var form  = document.getElementById('form');
var tags = ['input', 'select'];
console.log(group_elements(form, tags));
let arr = [...nodeList1, ...nodeList2];