【问题标题】:I can't get the className property to work on Safari我无法让 className 属性在 Safari 上工作
【发布时间】:2012-03-09 17:27:04
【问题描述】:

我在添加 a.className = "year"; 之前尝试了这个 javascript 函数,一切正常,但是添加它后,我无法使用 Safari 和 Google Chrome 加载页面。我需要做的只是向新的a 元素添加一个类,我也尝试使用a.setAttribute("class", "year"); 但我得到了同样的错误:页面无法加载.. 如果有人知道如何帮助我,我会非常感谢!

function create_timeline() {

    timeline = document.getElementById("timeline_ul");
    years = document.getElementsByClassName("year");
    for (i=0;i<years.length;i++) {
        if (years.item(i).nodeType==1) {
            year = years.item(i).innerHTML;
            a = document.createElement("a");
            a.innerHTML = year;
            a.className = "year";
            timeline.appendChild(a);
        }
    }

}

【问题讨论】:

  • 请注意:您正在创建一个 &lt;a&gt; 标记,但没有设置 href 属性以使链接标记实际执行任何有用的操作。

标签: javascript google-chrome safari classname


【解决方案1】:

但我遇到了同样的错误:页面无法加载..

问题是,您的代码在无限循环中运行。原因是:

  1. 通过下面的调用,您已经获取了类“year”的所有元素。返回的集合是动态集合

    years = document.getElementsByClassName("year");
    
  2. 在遍历集合时,您正在创建新的锚元素,并将它们设置为“年份”类。

  3. 当您将它们附加到文档时,它们将自动添加到第一步创建的集合中,因为它是一个动态集合,因为新元素匹配“主题”(这里是“年”类)集合。

为了避免无限循环,你有很多可能性。

  1. 将长度属性缓存在变量中

    var i=0, len = years.length;i<len;i++
    

但是使用这种方法,您无法确定新元素是添加到集合中还是以某种“逻辑”或“随机”顺序添加。

  1. 将集合转换为 JavaScript 数组

    years = document.getElementsByClassName("year");
    years = Array.prototype.slice.call(years, 0);
    
  2. 或使用 document.querySelectorAll,它返回一个静态元素集合。

    years = document.querySelectorAll('.year');
    

我会选择方法 #2 或 #3。

【讨论】:

  • 好的,我想我明白了。我需要“year”类来将样式应用于新的“a”元素,但因为我不一定需要将它们添加到动态集合我将只更改类值,我想它应该可以工作。非常感谢你,我想如果没有你的帮助,我会一直坚持这一点:D
猜你喜欢
  • 1970-01-01
  • 2014-02-13
  • 2011-04-10
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2016-06-05
相关资源
最近更新 更多