对于循环查询选择器全部
for of loop querySelectorAll
Mozilla声明"for of loops将正确循环NodeList对象"。(来源:https://developer.mozilla.org/en-US/docs/Web/API/NodeList)但是,这在Chrome 43中不起作用。这是不正确的文档还是浏览器错误?
在带有复选框的页面上使用的复制的示例代码:
var list = document.querySelectorAll( 'input[type=checkbox]' );
for (var item of list) {
item.checked = true;
}
编辑:这是在Chrome 51中提供的。
杰克·阿奇博尔德(Jake Archibald)发布了一个简单的修复:
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator]
和循环。
文档是正确的,但我不会称之为错误。相反,它是一个"尚未实现的功能"。
这没有标准,关于 DOM 应该如何与 ES6 集成的讨论仍在积极进行。请注意,很明显,querySelectorAll
应该返回一些可以在for of
循环中使用的可迭代的东西(正如常见的期望要求的那样),但不清楚应该如何发生(让我们实现NodeList
可迭代接口?让一些Elements
集合子类Array
?
您可以使用Array.from
let _list = document.querySelectorAll('input[type=checkbox]');
let list = Array.from(_list);
for (let item of list) {
//... just like an array
item.checked = true
}
或更短的时间
let list = document.querySelectorAll('input[type=checkbox]');
for (let item of Array.from(list)) {
item.checked = true
}
重要说明 Array.from
是在 Chrome 45 源代码中引入的。
由于我已经成功地在 Gecko 中使用了 for..of
来迭代 NodeList
s,这似乎是一个浏览器错误,或者至少是浏览器缺乏。
我目前使用的用户脚本的实际工作代码:
let llnk = document.querySelectorAll("div#threadlist a.threadtitle_unread");
for (let lnk of llnk) {
//...
}
(这也使用let
,但那是另一回事了。
尝试使用Array.prototype.entries()
var list = [].entries.call(document.querySelectorAll("input[type=checkbox]"));
for (item of list) {
item[1].checked = true;
};
<input type="checkbox" /><input type="checkbox" />
您也可以使用Array.prototype.values()
var list = [].values.call(document.querySelectorAll("input[type=checkbox]"));
for (item of list) {
item.checked = true;
};
<input type="checkbox" /><input type="checkbox" />
这是现代的另一种解决方案:
[...document.querySelectorAll("input[type=checkbox]")].forEach(node => {
node.textContent = "foo";
});
这利用了Google Chrome 46 +,Firefox 16 +和Edge支持的传播运算符,并且只是为了好玩的箭头功能。
这就是我所做的,用于不同的方法
Array.prototype.forEach.call(document.querySelectorAll("input[type=checkbox]"),function(ele,idx)
{
ele.checked = true;
}
IE9及以上版本良好
NodeList
的原生Symbol.iterator
支持于2014年添加到WHATWG的DOM规范中。
51是第一个支持它的Chrome版本,在撰写此答案时,其Beta版才刚刚发布。此外,任何版本的Internet Explorer或Edge都不支持。
若要在所有浏览器中添加对NodeList
Symbol.iterator
支持到代码中,只需使用以下 polyfill :
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
我遇到了这个问题。事实证明,我的是由使用参数而不是数组调用 Promise.all() 引起的。例如:
之前: Promise.all(p1, p2)
之后:Promise.all([p1, p2])
希望这对某人有所帮助。
- 未捕获的语法错误:无法在“文档”上执行“查询选择器”
- jQuery中的查询选择器导致无法识别的表达式
- j查询选择器不选择对象
- 事件冒泡与查询选择器
- 将查询选择器保存在要追加的变量中不起作用
- 不包含块引用的节点的查询选择器
- 查询选择器设置文本值
- 如何使用纯 Javascript 和文档查询选择器实现 jQuery .on() 函数
- 使用查询选择器查找同级行中包含的下一个单元格
- WebRTC文件传输和语法查询选择器
- 如何在聚合物中的自定义元素中成功查询选择器
- 聚合物查询选择器在聚合物元素中找不到自定义聚合物元素
- 更新的问题::查询选择器可能存在PhantomJS/Javascript问题
- 自定义查询选择器全部实现
- j查询选择器变量语法纠错
- j查询选择器无法正常工作
- IE8 查询选择器空值与正常空值
- 查询选择器全部不起作用
- Polymer.dom:dom元素的作用域查询选择器
- 如何使用查询选择器来选择常规短语