2010-01-28 27 views
0

由於某些原因,ss.transition()不會影響由onclick觸發的ss.goTo()之後的適當DOM元素。 Init下的ss.transition()調用按預期工作。我認爲這是一個範圍問題。幫助不大?JavaScript DOM引用不起作用

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
for (i in ss.as) { 

你不應該使用for...in遍歷數組或者,在這種情況下,節點列表。您將獲得您不想要的會員資格,例如itemlength。您也不能依賴以特定順序返回的物品;至少ss.last很可能不會成爲您所期望的。如果它是非項目屬性,ss.old.style.display肯定會失敗併發生異常,從而中斷腳本。

的順序正確的循環是老學校C的結構:

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

而且,你在哪裏綁定到goTo的電話?如果你在一個循環中使用你內部的函數,你也可能會遇到經典的閉環問題。見例如。 this question

+0

這是錯誤的,爲工作得很好,他的問題是,錯誤的元素顯示另一個原因。 – 2010-01-28 22:10:53

0

失敗的原因是因爲您在再次顯示之前丟失了對當前隱藏元素的引用。你需要指定old來顯示:block,然後切換old = current,current = variable,然後隱藏舊的。