1

我试图抓取的页面上有一堆跨度元素,它们的格式如下:

<div class="ca-evp1 te" style="color:#2952A3">
    <span class="te-t">11am&nbsp;</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 脚本非常复杂,并且使用调试器单步执行它们并没有产生一个我可以在逻辑上看到正在添加的元素的地方,所以我尝试使用间隔计时器来检查是否存在具有我正在寻找的类名的元素。

现在似乎可以解决问题,如果您有任何解决方案,我愿意接受更优雅的解决方案!还在研究这个...

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

3

您需要document.getElementsByClassName('te-s')在加载日历后执行此操作。

您之前看到的 32 是正确的。它向您显示 HTMLCollection 的对象,它是对数组的引用。因此,当eventToClick打印出来时,它的值为零.. 放一个调试器并查看它。但是在加载日历后,它eventToClick会向您显示所有值。长度0相同的原因。显示的长度是按值传递的。所以当你请求它时,长度实际上是0.

加载日历后必须有一些回调函数,您可以使用它来获取正确的值,您可以在那里获取正确的长度。

在此处输入图像描述

如果您在这方面需要帮助,请告诉我您正在使用的日历库,很乐意研究它。

于 2017-10-03T22:18:30.950 回答