JavaScript DOM引用没有阻止

时间:2010-01-28 21:29:14

标签: javascript dom scope reference

由于某些原因,ss.transition()在onslick触发ss.goTo()后不会影响相应的DOM元素。 // Init下的ss.transition()调用确实按预期工作。我认为这是一个范围问题。帮助不大?

var ss = {};

ss.goTo = function(i) {
    ss.old = ss.current;
    ss.current = ss.slides[i];
    ss.transition();
}

ss.transition = function() {
    ss.old.style.display = "none";
    ss.current.style.display = "block";
}

// Hooks

ss.div = document.getElementById("slides");
ss.as = ss.div.getElementsByTagName("a");

// References

ss.slides = [];
for (i in ss.as) {
    if (ss.as[i].rel == "slide") {
        ss.slides.push(ss.as[i]);
    }
}
ss.first = ss.slides[0];
ss.last = ss.slides[ss.slides.length-1];

// Init

ss.current = ss.first;
ss.old = ss.last;
ss.transition();

2 个答案:

答案 0 :(得分:2)

for (i in ss.as) {

您不应该在数组上使用for...in循环,或者在本例中使用NodeList。您将获得不需要的成员资产,例如itemlength。您也不能依赖于以任何特定顺序返回的项目;很可能至少ss.last不会是你所期望的。如果它是非商品属性,ss.old.style.display肯定会因异常而失败,从而破坏了脚本。

序列的正确循环是旧式C构造:

for (var i= 0; i<ss.as.length; i++)

此外,您将调用绑定到goTo的哪个位置?如果你在一个带有函数的循环中进行它,你可能也会遇到经典的循环闭包问题。见例如。 this question

答案 1 :(得分:0)

失败的原因是因为您在再次显示之前丢失了对当前隐藏元素的引用。你需要将old分配给display:block,然后切换old = current,current = variable,然后隐藏旧的。