另一个未捕获的TypeError ::无法读取未定义的属性'replace'

时间:2016-03-29 22:18:28

标签: javascript

我正在编写一些JS代码来切换某些DOM元素的类。 一切正常,但我也得到了这个错误 防止执行后面的代码。

我添加了一个检查,以确保元素数组不是空的,正如我想的那样 这是问题所在。但仍然会发生错误。在调用old_name时,调试始终显示replace的值。我错过了JS-esque的东西吗?

这是导致错误的代码部分,特别是第31行:


  if (w > MOBILE_THRESHOLD) {
    responsive_elements = document.getElementsByClassName("desktop");
    if (responsive_elements.length > 0) {
      for (i in responsive_elements) {
        var old_name = responsive_elements[i].className;
        var new_name = old_name.replace("desktop", "mobile");
        responsive_elements[i].className = new_name;
      }
    }

必要时,我很乐意提供更多代码或任何需要的信息。谢谢!

1 个答案:

答案 0 :(得分:5)

Never use for...in loops to iterate array-like objects!!!!!

在这种情况下,HTMLCollection具有可枚举的属性,例如itemnamedItem。访问这些内容不会返回HTML元素,因此className将是未定义的。

要正确迭代,您可以使用其中一个

for(var i=0; i<responsive_elements.length; ++i) {
  // ...
}

[].forEach.call(responsive_elements, function(element, index, collection) {
  // ...
});