实时节点列表还不错,但如果您不习惯,它们的行为可能会令人困惑。特别是如果您将它们视为数组(它们不是数组)
考虑一个将页面中的 div 数量加倍的经典示例。以下是这方面的三个尝试:
// Example 1 (doesn't work)
for(var i = 0; i < document.querySelectorAll("div").length ; i++){
document.body.appendChild(document.createElement("div"));
}
// Example 2 (works)
var divs = document.querySelectorAll("div");
for(var i = 0; i < divs.length ; i++){
document.body.appendChild(document.createElement("div"));
}
// Example 3 (doesn't work)
var divs = document.getElementsByTagName("div");
for(var i = 0; i < divs.length; i++){
document.body.appendChild(document.createElement("div"));
}
示例 1 显然是一个无限循环。每次迭代,它都会重新检查页面中 div 的数量。
示例 2 按预期工作,因为节点列表已经被缓存(当然最好只缓存长度)。
示例 3 看起来像示例 2。许多人希望它以相同的方式工作,因为节点列表是缓存的。但是由于节点列表是实时的,它实际上是另一个无限循环。这会抓住一些人。
此外,如果一个函数返回一个静态节点列表,您可以在每次需要时重新查询 DOM。这可以说比将您的实时列表转换为静态更简单。