我有一个接受HTML节点列表的Javascript函数,但它需要一个Javascript数组(它运行一些数组方法),我希望它的输出Document.getElementsByTagName返回一个DOM节点列表.
最初我想过使用简单的东西:
Array.prototype.slice.call(list,0)
Run Code Online (Sandbox Code Playgroud)
这在所有浏览器中都可以正常工作,当然除了返回错误"JScript对象预期"的Internet Explorer,因为显然Document.getElement*方法返回的DOM节点列表不是足以成为函数调用目标的JScript对象.
警告:我不介意编写Internet Explorer特定代码,但我不允许使用任何Javascript库,如JQuery,因为我正在编写一个嵌入第三方网站的小部件,我无法加载外部库会给客户造成冲突.
我最后的努力是迭代DOM节点列表并自己创建一个数组,但是有更好的方法吗?
我有以下代码在FF/Chrome中工作
var stack = [Array.prototype.slice.call(document.getElementsByTagName("body")[0].childNodes)], nodes, node, parent, text, offset;
while (stack.length) {
nodes = stack.pop();
for (var i=0, n=nodes.length; i<n; ++i) {
node = nodes[i];
switch (node.nodeType) {
case Node.ELEMENT_NODE:
if (node.nodeName.toUpperCase() !== "SCRIPT") {
stack.push(Array.prototype.slice.call(node.childNodes));
}
break;
case Node.TEXT_NODE:
text = node.nodeValue;
offset = text.indexOf("[test=");
if (offset >= 0 && text.substr(offset).match(/^(\[test=(\d+)\])/)) {
parent = node.parentNode;
var before = document.createTextNode(text.substr(0, offset));
link = document.createElement("a"),
after = document.createTextNode(text.substr(offset + RegExp.$1.length));
link.appendChild(document.createTextNode(text.substr(offset, RegExp.$1.length)));
link.setAttribute("href", "http://example.com/" + RegExp.$2);
parent.insertBefore(after, node);
parent.insertBefore(link, after); …Run Code Online (Sandbox Code Playgroud)