2016-09-16 44 views
0

我正在打字遊戲。當多個玩家玩遊戲時,它會再次運行相同的一組功能。我正在使用變量j作爲計數器,以在輸入正確時提示單詞。出於某種原因,在每次擊球時第二次傳球時,它會記錄j = 1 & j =無論先前玩家的最後一個字+ 1的值如何。當每個玩家玩牌時,我希望他們輸入的每一組單詞都是相同的,這樣纔是公平的。我無法弄清楚爲什麼會發生這種情況,甚至不知道變量如何同時具有2個值?!?!?計數器變量在函數的第2遍中保存2個值

什麼給?

下面是有問題的代碼,但有一堆可能涉及的回調函數,儘管調用這個變量的唯一地方是在這個函數內部。

//advances ship on correct typing 
function runRace() { 
    timer(); 
    var j = 1; 
    //BUG HERE !! Works fine on first iteration but on second 
    //iterations value jumps beteween 1 and whatever the next 
    //one is. It's like on every keystroke it reassigns var j 
    //back to 1, then back to the element number it was on 
    //last time 
    //!!! j has 2 values !!!it's keeping the value from the 
    //prior running of run race 
    $(document).keyup(function(e){ 
    var targetWord = $(".toType").text(); 
    var typedWord = $("#word").val(); 
    //while (j < gameWords.length){ 
     console.log("j = " + j); 
     if(typedWord === targetWord){ 
     $(".player").css({left: "+=15px",}); 
     targetWord = $(".toType").text(gameWords[j]); 
     $("#word").val(""); 
     j++; 
     }else { 
     return 
     }; 
    //} 
    }); 
} 

如果您需要查看代碼的其餘部分來了解它,它就在這裏。儘管它已經是不正確的的jsfiddle理性運行,它的工作原理等,然後錯誤,本地https://jsfiddle.net/ujsr139r/1/

+2

每次你調用'runRace()''你的代碼就是在'keyup'上創建一個監聽器 - 所以下一次運行的時候有2個keyups正在觸發,然後是3次3等等。你應該只有監聽器一次。 – Darren

+0

這是完全意義!現在我只需要弄清楚如何重構它只能調用它一次 – nwimmer123

回答

1

正如我在評論中提及了您要創建多個監聽每次runRace()被調用。

你可以嘗試這樣的事情,而不是(請注意,這不是要做到這一點的最好辦法,我只是demoing。像在這種情況下j全局變量是不是一個聰明的想法:

var j=1; // global because its outside of your function 
$(function(){ 
    $(document).keyup(function(e){ 
    var targetWord = $(".toType").text(); 
    var typedWord = $("#word").val(); 
    //while (j < gameWords.length){ 
     console.log("j = " + j); 
     if(typedWord === targetWord){ 
     $(".player").css({left: "+=15px",}); 
     targetWord = $(".toType").text(gameWords[j]); 
     $("#word").val(""); 
     j++; 
     }else { 
     return 
     }; 
    //} 
    }); 
}); 

//advances ship on correct typing 
function runRace() { 
    j = 1; 
    timer(); 
} 
+0

是的,我正在嘗試,我只是在事件列表中的文件準備就緒,但這使得一些其他功能失敗。我會嘗試這種方式,看看它是否RKS。 – nwimmer123

+0

工程就像一個魅力!謝謝!!這已經困擾我近2個小時了。再次感謝! – nwimmer123

+0

不用擔心。如果你不小心,考慮到全局變量會咬你。 – Darren

相關問題