JavaScript .children循环时的HTML集合长度问题
JavaScript .children HTML collection length issues when looping
我正在尝试循环使用以下代码从JavaScript的.children
属性产生的HTMLCollection:
var articles = data.children;
var newsGrid = document.getElementById('js-news__grid');
for (var i = 0; i < articles.length; i++) {
articles[i].classList.add('loading');
newsGrid.appendChild(articles[i]);
};
data
变量是一个成功的XHR的片段。当我运行循环时,它只附加第一个子元素和循环结束,当在循环之前运行console.log(articles);
时,它显示2个HTML元素(就像它应该的那样),但只有1的长度。如果我删除循环并运行console.log(articles);
,它会像以前一样显示2个HTML元素,但现在它的长度为2。
为了简单起见,我省略了XHR代码,因为HTMLCollection是由数据生成的。孩子看起来是对的。以下是日志信息:
[article.news__item, article.news__item]
0: article.news__item
1: article.news__item
length: 2
__proto__: HTMLCollection
[article.news__item, article.news__item]
0: article.news__item
length: 1
__proto__: HTMLCollection
问题是。children是一个活动集合,当您将每个子元素移出容器时,它将被更新。
在你的例子中,data
有2个子元素,所以当循环开始时,articles.length
是2,但是在第一次迭代之后,你重新定位了第一个子元素,这意味着articles
对象现在只包含1个元素,i
是2,现在循环条件i < articles.length
失败。
一个简单的解决方案是使用反向循环
var articles = data.children;
var newsGrid = document.getElementById('js-news__grid');
for (var i = articles.length - 1; i >= 0; i--) {
articles[i].classList.add('loading');
newsGrid.appendChild(articles[i]);
};
另一个解决方案是将articles
转换为普通数组
var articles = [].slice.call(data.children);
RobG建议的另一种方法是
var articles = data.children;
var newsGrid = document.getElementById('js-news__grid');
while (articles.length) {
articles[0].classList.add('loading');
newsGrid.appendChild(articles[0]);
};
相关文章:
- 在指令控制器中使用$attrs时出现问题
- 将PHP变量传递给jQuery时遇到问题
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- 参数变量出现ngTable指令问题
- 使用模板事件侦听器删除 Meteor.js 集合时出现问题
- 关系问题-Mongo集合和MeteorJS
- 主干模型/集合中的Javascript范围界定问题
- 正在从集合[性能/最佳实践/问题]中的数组中删除对象
- 将用户发布到其他集合时出现问题
- 添加模型到集合问题
- 分离“骨干”集合(事件问题)
- 通过模板事件向集合插入数据:安全问题和必要的回调
- Meteor Users集合和Deps.自动运行的问题
- 关于骨干网和集合的问题以及增加的机制
- 在集合中引用变量时出现问题.方法在渲染函数中
- 流星关于改变视图和把数组集合的问题
- JavaScript .children循环时的HTML集合长度问题
- 在id为的主干集合中获取问题
- 对于js中的of语句-dom集合的问题
- 问题在创建另一个集合从一个mongodb查询的结果在节点