Это мой код, я пытаюсь его получить, когда нажата кнопка, вы можете рубить дерево, когда вы не рубите дерево, он использует таймер, чтобы попытаться сделать это снова ( через 1 секунду). Как только дерево будет расколото, предположим, чтобы установить 5-секундный таймер, который делает его "неактивным", пока таймер не встанет, он снова будет "активным". Для этого вам нужно снова нажать кнопку, чтобы начать цикл.
var woodcuttingLevel = 0;
var count = 0;
var treeSpawn;
var reClick;
function cutTree(){
var randomEvent = Math.floor((Math.random()*7)+1);
document.getElementById("message").innerHTML = "chop " + count;
count += 1;
switch(randomEvent){
case 1:
//add a log
document.getElementById("treeActive").innerHTML = "inActive1";
treeSpawn=setTimeout(function(){spawnTree()},5000);
break;
case 2:
//add a log if over level 5
if(woodcuttingLevel >= 5){
document.getElementById("treeActive").innerHTML = "inActive2";
treeSpawn=setTimeout(function(){spawnTree()},5000);
}
reClick=setTimeout(function(){reClick()},1000);
break;
case 3:
//add a log if over level 8
if(woodcuttingLevel >= 8){
document.getElementById("treeActive").innerHTML = "inActive3";
treeSpawn=setTimeout(function(){spawnTree()},5000);
}
reClick=setTimeout(function(){reClick()},1000);
break;
case 4:
//add a log if over level 13
if(woodcuttingLevel >= 13){
document.getElementById("treeActive").innerHTML = "inActive4";
treeSpawn=setTimeout(function(){spawnTree()},5000);
}
reClick=setTimeout(function(){reClick()},1000);
break;
case 5:
//add a log if over level 17
if(woodcuttingLevel >= 17){
document.getElementById("treeActive").innerHTML = "inActive5";
treeSpawn=setTimeout(function(){spawnTree()},5000);
}
reClick=setTimeout(function(){reClick()},1000);
break;
case 6:
//add a log if over level 22
if(woodcuttingLevel >= 22){
document.getElementById("treeActive").innerHTML = "inActive6";
treeSpawn=setTimeout(function(){spawnTree()},5000);
}
reClick=setTimeout(function(){reClick()},1000);
break;
case 7:
//add a log if over level 30
if(woodcuttingLevel >= 30){
document.getElementById("treeActive").innerHTML = "inActive7";
treeSpawn=setTimeout(function(){spawnTree()},5000);
}
reClick=setTimeout(function(){reClick()},1000);
break;
default:
//error
}
}
function spawnTree(){
document.getElementById("treeActive").innerHTML = "Active";
clearInterval(treeSpawn);
clearInterval(reClick);
}
function reClick(){
cutTree();
}
Функция reClick() не работает, я не совсем уверен, почему. Может ли кто-нибудь привести меня к ответу? Спасибо за ваше время!
Функция reClick
не работает, потому что ее больше нет, когда вы пытаетесь ее вызвать.
Вы использовали одно и то же имя для переменной, которая содержит идентификатор таймаута, поэтому он заменит эту функцию при запуске таймаута. Используйте другое имя для переменной. Изменить:
var reClick;
чтобы:
var reClickTimer;
и все:
reClick=setTimeout(function(){reClick()},1000);
чтобы:
reClickTimer=setTimeout(function(){reClick()},1000);
а также:
clearInterval(reClick);
чтобы:
clearInterval(reClickTimer);
Замечание: поскольку метод setTimeout
принимает функцию обратного вызова в качестве первого параметра, вам не нужно выражение функции, вызывающее эту функцию, вы можете сами использовать ссылку на функцию:
reClickTimer=setTimeout(reClick,1000);
Проблема в том, что когда вы выполняете это задание
reClick=setTimeout(function(){reClick()},1000);
Вы по существу reClick
определение функции reClick
и заменяете его результатом setTimeout
, который является "id", который идентифицирует текущую операцию таймаута. Вам нужно будет переименовать переменную, определенную сверху, с помощью var reClick
, например, var reClickTimeout
, которую вы можете использовать следующим образом
reClickTimeout=setTimeout(function(){reClick()},1000);
Разумеется, вам также необходимо будет заменить все другие неулокальные ссылки, например
clearInterval(reClick); -> clearInterval(reClickTimeout);
function(){ fn() } === fn