我试图抓取的页面上有一堆跨度元素,它们的格式如下:
<div class="ca-evp1 te" style="color:#2952A3">
<span class="te-t">11am </span>
<span class="te-s">Antoine Diel</span>
</div>
所以,我决定使用 getElementsByClassName() 来选择它们,然后遍历这个 HTMLCollection,当我在开发者控制台中查看它时显示 32 个项目,但是当我检查长度属性时它是 0。
var toType = function(obj) {
return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}
var eventToClick = document.getElementsByClassName('te-s');
console.log(eventToClick); // shows 32 elements
console.log(toType(eventToClick)); //htmlcollection
console.log(eventToClick.length); // 0...huh?
我一定遗漏了 getElementsByClassName 或 HTMLCollections 在一般工作中的工作方式,但此时我似乎无法通过文档或 Google 弄清楚。
据我了解,如果我将所有这些 span 元素视为 console.log 语句的一部分,它们应该会影响eventToClick HTMLCollection 的长度,并且我应该能够使用 for 循环对其进行迭代,但这不起作用!开发人员控制台是否在这里执行某种巫术,而我并没有真正将这些元素作为 HTMLCollection 的一部分?
这是一个实时版本,因此您可以在自己的浏览器中复制:http: //danielschroedermusic.com/apps/cal-test/cal.html
在控制台中为帮助解决此问题的人发布第二张 span 元素的图像。
工作解决方案,但不是很好!
document.addEventListener('DOMContentLoaded', function(event) {
var intervalID = window.setInterval(myCallback, 50);
function myCallback() {
var eventToClick = document.getElementsByClassName('te-s');
if (eventToClick.length > 0) {
console.log(eventToClick);
for (var i = 0; i < eventToClick.length; i++) {
console.log(eventToClick[i]); // 32 elements!
}
clearInterval(intervalID);
}
}
});
正如 Harshal 在接受的答案中指出的那样,我无法抓取这些元素,因为我的脚本在它们加载到页面上之前正在执行。正在加载此日历数据的 Google 脚本非常复杂,并且使用调试器单步执行它们并没有产生一个我可以在逻辑上看到正在添加的元素的地方,所以我尝试使用间隔计时器来检查是否存在具有我正在寻找的类名的元素。
现在似乎可以解决问题,如果您有任何解决方案,我愿意接受更优雅的解决方案!还在研究这个...