2012-06-01 72 views
1

我已經得到的基本上決定了哪個按鈕應該通過在任何一點的web應用程序可見選擇一個簡單的數組功能。dynamiclly設置事件聽者應該叫

所以對於家庭數組是這樣的:第1步

if (view === "home") { 
    visibleCommands = []; 
    visibleCommands[0] = "contact"; 
    visibleCommands[1] = "about"; 
} 
setVisibility(visibleCommands); 

然後,我遍歷數組:第2步

setVisibility(visibleCommands) { 
    var i; 
    for (i in visibleCommands) { 
    document.getElementById(visibleCommands[i].style.display = "inline"; 
    } 
    addEvents(visibleCommands); 
} 

然後最後,因爲我要添加單獨的事件可見命令聽衆:步驟3

addEvents(visibleCommands) { 
    var i; 
    for (i in visibleCommands) { 
    document.getElementById(visibleCommands[i]).addEventListener("click", visibleCommands[i], false); 
    } 
} 

然而事件似乎並沒有掛鉤到v中的元素IEW,如果我改變這一行:

document.getElementById(visibleCommands[i]).addEventListener("click", contact, false); 

然後正確地被掛在元件和接觸()函數被調用。

我在做什麼錯?

回答

1

您的代碼:

document.getElementById(visibleCommands[i]).addEventListener("click", visibleCommands[i], false); 

visibleCommands[i]ID

document.getElementById(visibleCommands[i]) 

visibleCommands[i]點擊回調

.addEventListener("click", visibleCommands[i], false); 

又怎麼了是?

"contact"contact是兩個不同勢的事情。首先是與contact值的字符串,而第二個是一個函數的引用


另一件事:

document.getElementById(visibleCommands[i].style.display = "inline"; 

有一個在getElementById函數調用缺少)

document.getElementById(visibleCommands[i]).style.display = "inline"; 
+0

的console.log(visibleCommands [I])的內部的for循環給我 「接觸」 – CLiown

+0

因此所得到的輸出應爲:的addEventListener( 「點擊」,接觸,FALSE); – CLiown

+0

@CLiown。看到更新,你可以使用'eval'''eval(visibleCommands [i])'從字符串中獲取函數引用,但是你應該更好地設計你的代碼,所以你不會使用它。 – gdoron

0

你在哪裏綁定處理程序?

document.getElementById(visibleCommands[i]).addEventListener("click", visibleCommands[i], false); 

在上述行中的第二參數是一個字符串,它是不正確的。它應該是處理函數。

嘗試像下面,

document.getElementById(visibleCommands[i]).addEventListener("click", function() { 
    alert('Clicked'); 
}, false); 

你可以閱讀有關addEventListener

還可以使用.push有道元素添加到一個數組。見下文,

visibleCommands.push("contact"); 
visibleCommands.push("about");