2016-02-08 71 views
4

我正在選擇完全用HTML和Javascript編寫的冒險遊戲;我想完全用Javascript創建大部分元素來創建一個真棒動態遊戲!我無法使用事件和事件偵聽器。這是一個神祕的遊戲;玩家從列表中選擇角色後,可邀請5位嘉賓參加派對。其中一名客人遇難,讓您與三名嫌疑人解開謎團。在Javascript中創建和調用事件

當您選擇了播放器之後,還有另一個按鈕「選擇此字符!」。點擊此按鈕時,播放器創建用戶界面應被隱藏,並且可以看到新的用戶界面。使用現在的代碼,「StartGame」函數完全被跳過。我究竟做錯了什麼?你可以給任何幫助將是非常真棒,非常感謝!

btnPlayer = document.createElement('button'); 
btnPlayer.id = 'BTN_btnPlayer'; 
btnPlayer.type = 'button'; 
btnPlayer.addEventListener('click', welcomePlayer(), true); 
btnPlayer.onclick = welcomePlayer(); 
btnPlayer.innerHTML = 'Select This Character!'; 
myDiv.appendChild(btnPlayer); 

編輯 我修改按鈕事件屬性看起來像這樣:

btnPlayer.addEventListener('click', welcomePlayer, true); 
//btnPlayer.onclick = welcomePlayer; 

一個被註釋掉了,因爲他們都沒有工作。我也試着清理我的緩存。這裏是我的StartGame()函數,排除了按鈕代碼。我將不包含用於在我的下拉列表中創建選項的「charFirstNames []」和「charLastNames []」。我把他們分開,以便講一個更有趣的故事;他們最終會在我得到錯誤和基本知識後得到數據庫記錄。我不認爲我在這裏搞砸了什麼,但是我有可能做到了嗎?該功能由編碼到HTML中的唯一按鈕調用。

function startGame(divName) { 
myDiv = document.getElementById('story'); 

lblPlayer = document.createElement('label'); 
lblPlayer.id = 'LBL_Player'; 
lblPlayer.htmlFor = 'DDL_PlayerChar'; 
lblPlayer.innerHTML = 'Please select a character. '; 
myDiv.appendChild(lblPlayer); 

ddlPlayer = document.createElement('select'); 
ddlPlayer.id = 'DDL_PlayerChar'; 
myDiv.appendChild(ddlPlayer); 

defOpt = document.createElement("option"); 
defOpt.value = 0; 
defOpt.text = 'Select...'; 
ddlPlayer.appendChild(defOpt); 

//Create and append the options 
for (var i = 0; i < charFirstNames.length; i++) { 
    var option = document.createElement("option"); 
    option.value = charFirstNames[i]+'_'+charLastNames[i]; 
    option.text = charFirstNames[i]+' '+charLastNames[i]; 
    ddlPlayer.appendChild(option); 
} 

document.getElementById('BTN_Start').hidden = true; 

}

的welcomePlayer()函數類似於startgame()函數,創建界面邀請的第一個 「客人」,並刪除玩家創建UI。

+0

什麼 「StartGame」 功能? – andrew

+0

'btnPlayer.addEventListener('click',welcomePlayer(),true);'應該是'btnPlayer.addEventListener('click',welcomePlayer,true);'不帶()。當你添加圓括號時,函數會立即被喚起,而不是等待t甚至觸發它。您還將通過事件監聽器添加事件2x,並通過「onclick」(一次不會再有()函數立即調用該函數)添加一次。選擇一種方法並堅持下去。 – scrappedcola

+0

@scrappedcola雖然我高度懷疑它,如果'welcomePlayer'返回一個閉包它仍然工作代碼:) – Tyblitz

回答

5

這兩行都將onclick句柄設置爲調用welcomePlayer函數的結果(請參閱parens?)。

btnPlayer.addEventListener('click', welcomePlayer(), true); 
btnPlayer.onclick = welcomePlayer(); 

你大概的意思

btnPlayer.addEventListener('click', welcomePlayer, true); 
+0

所以我需要創建一個變量函數? 'var welcomePlayer = function(){// code here}; – Shortstuff81000

+0

@ Shortstuff81000它應該以同樣的方式工作。 – dtanders

+2

@ Shortstuff81000這裏無論你做'var welcomePlayer = function(){}'或'function welcomePlayer(){}'都沒關係。前者是一個*變量賦值*(僅適用於在其之後初始化的代碼,並且受*函數範圍*的限制),而後者是*函數聲明*(立即定義,全局且可用於所有代碼)。 – Tyblitz