JavaScript 抛出 TypeError 说我的变量未定义

JavaScript throws TypeError saying that my variable is undefined

我在JavaScript方面经验不多,目前我有这个:

  function loop() {
    var authorDivs = document.getElementById('ctl00_MainContent_MCPObjectInfo_dvCreatorView').getElementsByTagName("div");

    for (var i = 0; i < authorDivs.length; i++) {
        var divOfDiv = authorDivs[i].getElementsByTagName("div");

        if (typeof divOfDiv.item(i) === 'undefined' || divOfDiv.item(i) === null) {
            console.log("This is undefined or null");
        }
        else {
            var realDivs = divOfDiv.item(i);
            realDivs.item(i).textContent = "please work plz";
        }
    }
}

我从 FireFox 的控制台收到以下错误:TypeError: realDivs is undefined 在这一行:realDivs.item(i).innerHTML = "please work plz";

基本上我所拥有的(在我看来)是一个循环,它通过 authorDivs 并获取那些 divs 中的所有 divs 并将它们保存在 divOfDiv.然后我检查 divOfDiv 中的 divsundefined 还是 null,如果它们是 而不是 那么那些 divs 保存在一个变量 realDivs 中,然后我用它来编辑 innerHTML。这就是我最希望看到的情况,是什么导致了错误?我究竟做错了什么?

注意:我无法访问 jQuery,但只能访问 JavaScript。

编辑:我已经添加了下面建议的更改并修复了 - 谢谢!但我现在收到以下错误:TypeError: realDivs.item is not a function

是什么原因造成的?另外请注意,我如何知道何时处理数组以及何时处理 HTMLCollection?你只是假设吗?我以前从未使用过松散类型的语言,所以它对我来说是新的。

如果您的 if (typeof divOfDiv.item(i) === 'undefined' || 'null') returns 为真,就会发生这种情况。然后你永远不会初始化 realDivs (如果条件是假的会发生什么)。稍后您尝试在该单元化对象

上调用 item 函数

好吧,您需要将该代码移到本应阻止它的条件块中!此外,|| "null" 不会像您预期的那样工作,您需要明确检查 || divOfDiv.item(i) === null

所以试试

for (var i = 0; i < authorDivs.length; i++) {
    var divOfDiv = authorDivs[i].getElementsByTagName("div");

    if (divOfDiv.item(i) == null) {
        console.log("This is undefined or null");
    } else {
        var realDivs = divOfDiv.item(i)
        realDivs.item(i).innerHTML = "please work plz";
        console.log(divOfDiv.item(i));
    }
}

但是,由于两个原因,这仍然不起作用:

  • 用于访问第 idivOfDivi 索引来自对 authorDivs 的迭代 - 几乎不是您想要的。相反,对所有 divOfDivs 使用第二个循环。
  • 您的 realDivs 变量确实包含一个 <div>,它没有 .item 方法。您只需直接访问其 .innerHTML 属性.

所以你应该使用

var authorDivs = document.getElementById('authorView').getElementsByTagName("div");
for (var i=0; i<authorDivs.length; i++) {
    var divsOfDiv = authorDivs.item(i).getElementsByTagName("div");

    for (var j=0; j<divsOfDiv.length; j++) {
        var realDiv = divsOfDiv.item(j);
        realDiv.innerHTML = "please work plz";
        console.log(realDiv);
    }
}

代码中有两个问题。

  1. 比较 DOM 对象与 'undefined' 和 null。如果 div 标签在 authorDivs[i] 中不可用,它将 return 清空 DOM 数组。因此,空 DOM 数组与 undefined 和 null 的比较不是好的方法。我们可以使用数组长度 属性 来进行验证。

    divOfDiv = authorDivs[i].getElementsByTagName("div");
    if(divOfDiv.length > 0) { 控制台语句}

  2. 由于 item(i) 已经是 return 单个 DOM 元素,"realDivs" 变量的 item(i) 不是正确的方法。除此之外,在验证realDivs是否包含DOM元素后,需要使用innerHTML方法。请更新代码如下。

    var realDivs = divOfDiv.item(i); 真人秀? (realDivs.innerHTML = "please work plz"): 空;

注意:如果 DOM 不可用,项目 (i) 将 return 为空。