我正在尝试在我的HTML页面上显示下一个JavaScript代码:
var langs = document.getElementsByClassName('ss-code-language');
for (var i in langs)
{
langs[i].classList.remove('ss-highlighted');
document.getElementById('assa').classList.remove('ss-highlighted');
}
它运作正常。但是当我删除下一行时:
var langs = document.getElementsByClassName('ss-code-language');
for (var i in langs)
{
langs[i].classList.remove('ss-highlighted');
}
我得到了
未捕获的TypeError:无法调用未定义的方法'remove'。
但我在Watch中看到该项目已定义。下一行代码如何影响前一行。
答案 0 :(得分:5)
document.getElementsByClassName('ss-code-language')
返回一个类似数组的对象而不是数组。
元素是找到元素的HTMLCollection。
在for (var i in langs)
中,您实际上是遍历所有对象的属性。
通过HTMLCollection循环:
collection = document.getElementsByClassName('ss-code-language');
var len = collection.length //see below - accessing length is expensive!
for(var i=0; i<len; i++){
collection.item(i) /* ... */
}
<强>修正强>:
使用HTMLCollection时,建议缓存length
属性。更多信息见:
(感谢@Benjamin Gruenbaum)
答案 1 :(得分:1)
不确定第二行如何影响第一行,但您肯定会通过添加支票来解决它:
var langs = document.getElementsByClassName('ss-code-language');
for (var i in langs) {
if (typeof langs[i].classList != 'undefined') {
langs[i].classList.remove('ss-highlighted');
}
}
答案 2 :(得分:0)
您可以使用console.log();用于调试:
示例:
var hello = "hello world!";
console.log(hello);
这会在网络浏览器控制台上打印“你好世界”。
对于您的问题,您应该在这里使用“typeof”来源帮助您 How to use "typeof"
这是一个解决方案:
var langs = document.getElementsByClassName('ss-code-language');
for (var i in langs){
if ( typeof langs[i] === 'undefined' ||
typeof langs[i].classList === 'undefined')
continue;
langs[i].classList.remove('ss-highlighted');
}
我希望这能帮到你!
答案 3 :(得分:0)
这似乎是Chrome调试器的一个错误。 我在IE中测试了这个脚本,没关系。 此脚本可在Chrome中正常运行而无需调试。