我没有太多的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
中的divOfDiv
是undefined
还是null
,如果不是,则将这些divs
保存在变量realDivs
中,然后使用该变量来编辑innerHTML。这就是我理想中希望发生的情况,是什么导致错误?我究竟做错了什么?注意:我无权访问jQuery,而只能访问JavaScript。
编辑:我已经添加了下面建议的更改,并对其进行了修复-谢谢!但是我现在遇到以下错误:
TypeError: realDivs.item is not a function
是什么原因造成的?另一个需要注意的是,我如何知道何时处理数组以及何时处理HTMLCollection?你只是假设吗?我以前从未使用过松散类型的语言,因此它对我来说是新的。
最佳答案
好吧,您需要将该代码移入应该阻止该条件的条件块中!另外,|| "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
的divOfDiv
索引来自authorDivs
上的迭代-几乎不是您想要的。而是在所有divOfDiv
上使用第二个循环。您的
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);
}
}