JavaScript抛出TypeError表示我的变量未定义

时间:2015-05-13 16:51:43

标签: javascript html typeerror

我在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中。然后我检查divs中的divOfDivundefined还是null,如果那么divs获取保存在变量realDivs中,然后我用它来编辑innerHTML。那是我理想喜欢看到的,是什么导致错误?我究竟做错了什么?

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

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

是什么造成的?另一方面,我如何知道我何时处理数组以及何时处理HTMLCollection?你只是假设?我从来没有使用过松散类型的语言,所以它对我来说是新手。

3 个答案:

答案 0 :(得分:2)

如果您的if (typeof divOfDiv.item(i) === 'undefined' || 'null')返回true,则会发生这种情况。然后你永远不会初始化realDivs(如果条件是假的会发生什么)。稍后您尝试在该单元化对象上调用item函数

答案 1 :(得分:2)

好吧,您需要将该代码移动到应该阻止它的条件块中!此外,|| "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));
    }
}

然而,由于两个原因,这仍然无法发挥作用:

  • 您用来访问i - i的{​​{1}}索引来自divOfDiv上的迭代 - 几乎不是您想要的。相反,在所有authorDivs上使用第二个循环。
  • 您的divOfDiv变量确实包含一个realDivs,但没有<div>方法。您只需直接访问其.item媒体资源。

所以你应该使用

.innerHTML

答案 2 :(得分:0)

代码中存在两个问题。

  1. 将DOM对象与未定义的&#39;进行比较和null。如果authorDivs [i]中没有div标签,它将返回空DOM数组。因此,将空DOM数组与undefined和null进行比较并不是一个好方法。我们可以使用数组长度属性进行验证。

    divOfDiv = authorDivs [i] .getElementsByTagName(&#34; div&#34;);
    if(divOfDiv.length&gt; 0){console statement}

  2. 由于项目(i)已经返回单个DOM元素,&#34; realDivs&#34;的项目(i)变量不是正确的方法。除此之外,在验证realDivs是否包含DOM元素之后,还需要使用innerHTML方法。请更新以下代码。

    var realDivs = divOfDiv.item(i);  realDivs? (realDivs.innerHTML =&#34;请工作PLZ&#34;):null;

  3. 注意:如果DOM不可用,则item(i)将返回null。