Javascript JS:setInterval运行时就像设置了多个间隔一样
所以,我一直在尝试找出JS,还有什么比做一个小项目更好的方法。这是一个小的琐事游戏,它有一个我用setInterval制作的问题计时器。不幸的是,在回答了多个问题之后,interval的行为变得非常奇怪——它每次运行两次命令。我猜这是我错误地实现了按钮按钮? 顺便说一句,如果我的代码很糟糕的话,我很抱歉,我一直在不顾一切地修复这个问题,并且把它弄得一团糟Javascript JS:setInterval运行时就像设置了多个间隔一样,javascript,jquery,Javascript,Jquery,所以,我一直在尝试找出JS,还有什么比做一个小项目更好的方法。这是一个小的琐事游戏,它有一个我用setInterval制作的问题计时器。不幸的是,在回答了多个问题之后,interval的行为变得非常奇怪——它每次运行两次命令。我猜这是我错误地实现了按钮按钮? 顺便说一句,如果我的代码很糟糕的话,我很抱歉,我一直在不顾一切地修复这个问题,并且把它弄得一团糟 function startGame(){ if (clicked === true){ return; }
function startGame(){
if (clicked === true){
return;
}
else{
$("#textPresented").html("Which anthem is this?");
$("#button").css("display", "none");
currentCountry = getRndInteger(0,8);
console.log(currentCountry);
var generatedURL = anthemnflags[currentCountry];
console.log(generatedURL);
audios.setAttribute("src", generatedURL);
audios.play();
$("#button").html("I know!");
$("#button").css("display", "block");
$("#button").click(function () {
continueManager();
});
y=10;
console.log("cleared y" + y);
x = setInterval(function(){
y = y - 1;
console.log("Counting down..." + y)
}, 1000);
console.log("INTERVAL SET");
}
}
以下是控制台输出:
cleared y10 flaggame.js:59:17
INTERVAL SET flaggame.js:64:17
AbortError: The fetching process for the media resource was aborted by the user agent at the user's request. flaggame.js:49
Counting down...9 flaggame.js:62:20 ---- THESE TWO ARE BEING PRINTED AT THE SAME TIME
Counting down...8 flaggame.js:62:20 ---- THESE TWO ARE BEING PRINTED AT THE SAME TIME
Counting down...7 flaggame.js:62:20
Counting down...6 flaggame.js:62:20
Counting down...5 flaggame.js:62:20
Counting down...4 flaggame.js:62:20
Counting down...3 flaggame.js:62:20
Counting down...2 flaggame.js:62:20
Counting down...1 flaggame.js:62:20
Counting down...0
我的代码的其余部分:
function middleGame(){
$("#button").css("display", "none");
var n = document.querySelectorAll(".flagc").length;
correctIMG = getRndInteger(0,n-1);
showFlags();
var taken = new Array();
for (var i = 0; i < n; ++i){
if (i === correctIMG){
images[i].attr("src", "res/" + flagsfiles[currentCountry]);
taken[currentCountry] = true;
}
else{
var randomFlag = getRndInteger(0, flagsfiles.length);
if (randomFlag !== currentCountry && taken[randomFlag] !== true){
images[i].attr("src", "res/" + flagsfiles[randomFlag]);
taken[randomFlag] = true;
}
}
}
$(".flagc").click(function(){
clickregister(this);
});
}
function continueManager(){
if (!clicked){
audios.pause()
clearInterval(x);
x = 0;
clicked = true;
middleGame();
return;
}
}
function clickregister(buttonClicked){
if ($(buttonClicked).attr("id") != correctIMG){
points = points - 1;
flagARR[$(buttonClicked).attr("id")].css("display", "none");
console.log("INCORRECT");
}
else{
if (y >= 0) {
var addedPoints = 1 + y;
points = points + addedPoints;
$("#points").html(points);
}
else{
points = points + 1;
}
hideFlags();
clicked = false;
startGame();
}
}
$(function(){
hideFlags();
$("#textPresented").html("When you're ready, click the button below!");
$("#button").html("I am ready!");
$("#button").click(function () {
if (!gameStarted){
gameStarted = true;
alert("STARTING GAME");
startGame();
}
});
});
EDIT2:我的clickregister()函数似乎被调用了两次,然后该函数调用了StartName()两次
EDIT3:我找到了罪犯!这是以下几行代码:
$(".flagc").click(function(){
console.log("button" + $(this).attr("id") + "is clicked");
clickregister(this);
});
它们会被调用两次,对于同一个按钮,您需要先清除间隔,然后再调用。您可以通过在事件侦听器范围之外创建一个变量来实现这一点,并在事件侦听器中检查该变量是否包含任何内容。如果是,则清除间隔x。清除间隔后,可以重置间隔 大概是这样的:
<button class="first" type="submit">Button</button>
const btn = document.querySelector('.first');
let x;
btn.addEventListener("click", () => {
x && clearInterval(x)
x = setInterval(() => console.log("yoo"), 500)
})
按钮
const btn=document.querySelector('.first');
设x;
btn.addEventListener(“单击”,()=>{
x&清除间隔(x)
x=setInterval(()=>console.log(“yoo”),500)
})
这是因为如果不清除x的间隔,每次按下按钮都会创建一个新的间隔。我修复了它!
结果我所要做的就是添加
$(".flagc").unbind('click');
在.click()函数之前 你能把它简化成一个在这里的代码片段中运行的please吗?只是一个粗略的猜测,也许你在类
flagc
中都嵌套了HTML元素,因此,单击内部的一个会触发两个标记上的单击事件?可能是偶然的-可能你有两个应该相邻的标记,但由于意外,标记没有正确关闭,第一个标记最终包含第二个标记。我非常确定我的标记一切正常,由于第一个和第二个问题在一些挖掘之后按照预期工作,似乎我的Clickregister函数被调用了两次,它也调用了StartName两次。我还仔细检查了我的HTML标记,它不应该单击twiceYep,我现在也看到了,否则每次游戏开始时,都会添加另一个侦听器
$(".flagc").unbind('click');