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
中的 divs
是 undefined
还是 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));
}
}
但是,由于两个原因,这仍然不起作用:
- 用于访问第
i
个 divOfDiv
的 i
索引来自对 authorDivs
的迭代 - 几乎不是您想要的。相反,对所有 divOfDiv
s 使用第二个循环。
- 您的
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);
}
}
代码中有两个问题。
比较 DOM 对象与 'undefined' 和 null。如果 div 标签在 authorDivs[i] 中不可用,它将 return 清空 DOM 数组。因此,空 DOM 数组与 undefined 和 null 的比较不是好的方法。我们可以使用数组长度 属性 来进行验证。
divOfDiv = authorDivs[i].getElementsByTagName("div");
if(divOfDiv.length > 0) { 控制台语句}
由于 item(i) 已经是 return 单个 DOM 元素,"realDivs" 变量的 item(i) 不是正确的方法。除此之外,在验证realDivs是否包含DOM元素后,需要使用innerHTML方法。请更新代码如下。
var realDivs = divOfDiv.item(i);
真人秀? (realDivs.innerHTML = "please work plz"): 空;
注意:如果 DOM 不可用,项目 (i) 将 return 为空。
我在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
中的 divs
是 undefined
还是 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));
}
}
但是,由于两个原因,这仍然不起作用:
- 用于访问第
i
个divOfDiv
的i
索引来自对authorDivs
的迭代 - 几乎不是您想要的。相反,对所有divOfDiv
s 使用第二个循环。 - 您的
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);
}
}
代码中有两个问题。
比较 DOM 对象与 'undefined' 和 null。如果 div 标签在 authorDivs[i] 中不可用,它将 return 清空 DOM 数组。因此,空 DOM 数组与 undefined 和 null 的比较不是好的方法。我们可以使用数组长度 属性 来进行验证。
divOfDiv = authorDivs[i].getElementsByTagName("div");
if(divOfDiv.length > 0) { 控制台语句}由于 item(i) 已经是 return 单个 DOM 元素,"realDivs" 变量的 item(i) 不是正确的方法。除此之外,在验证realDivs是否包含DOM元素后,需要使用innerHTML方法。请更新代码如下。
var realDivs = divOfDiv.item(i); 真人秀? (realDivs.innerHTML = "please work plz"): 空;
注意:如果 DOM 不可用,项目 (i) 将 return 为空。