我不能让setInterval()在Javascript中工作

我有一个算法,可以生成给定单词的排列。 我正在尝试使用setInterval()来生成下一个排列,但该函数只运行一次! 我无法弄清楚为什么。 我没有收到任何错误消息。 这是我的代码

 var splitted; var t; $(document).ready(function() { $('#SubmitBtn').click(function() { //change Start to Stop and change button id $('#SubmitBtn').attr('id','StopBtn').attr('value','Stop'); //and add click event to it $('#StopBtn').click(function() { clearInterval(t); $('#StopBtn').attr('value','Submit'); $('StopBtn').attr('id','SubmitBtn'); }); if ($('#AnagramTxtArea').val().length>0) $('#AnagramTxtArea').text(''); var inputTxt = $('#anagram').val(); splitted = inputTxt.split(""); splitted.sort(); //first sort the array in order to generate permutations $('#AnagramTxtArea').append(splitted.join("") + " "); t= setInterval(GeneratePermutation(),10); }); }); var AnagramObj = new Anagram(); function GeneratePermutation() { splitted = AnagramObj.NextPermutation(splitted); if (splitted!=null) $('#AnagramTxtArea').append(splitted.join("") + " "); else $('#StopBtn').click(); } 

和HTML:

 


编辑:然而,另一个问题:

调用$(’#StopBtn’)时,click()代码在现有click事件函数后继续执行。 所以我处在一个无限循环中。

您需要将函数对象本身传递给setInterval() ,而不是调用函数的结果:

 t = setInterval(GeneratePermutation,10); // ^ No parentheses 

编辑:在第二个问题上,你可以做的是检查间隔是否正在运行。 如果是,则取消它:

 var splitted; var t; $(document).ready(function() { $('#SubmitBtn').click(function() { if (t !== undefined) { //interval is already running clearInterval(t); t = undefined; $('#SubmitBtn').attr('value','Submit'); } else { //change Start to Stop $('#SubmitBtn').attr('value','Stop'); if ($('#AnagramTxtArea').val().length>0) $('#AnagramTxtArea').text(''); var inputTxt = $('#anagram').val(); splitted = inputTxt.split(""); splitted.sort(); //first sort the array in order to generate permutations $('#AnagramTxtArea').append(splitted.join("") + " "); t = setInterval(GeneratePermutation,10); } }); }); 

在这里,您实际上在调用setInterval()时执行GeneratePermutation() ():

 t = setInterval(GeneratePermutation(),10); 

您必须将函数传递给setInterval()。 改为:

 t = setInterval(GeneratePermutation, 10); 

您必须传入函数名称或匿名函数作为setInterval的第一个参数。 请参阅MDN参考https://developer.mozilla.org/en/window.setInterval

 t = setInterval(GeneratePermutation,10); 

要么

 t = setInterval(function() { /* code */ }, 10); 

setInterval的正确语法:

 var intervalID = window.setInterval(func, delay[, param1, param2, ...]); var intervalID = window.setInterval(code, delay); 

哪里

  • intervalID是您可以传递给clearInterval()的唯一间隔ID。
  • func是您想要重复调用的函数。 代码在
  • 备用语法,是您希望重复执行的一串代码。 (建议不要使用此语法,原因与使用eval()相同)延迟是setInterval()函数在每次调用func之前应等待的毫秒数(千分之一秒)。 与setTimeout一样,强制执行最小延迟。

编辑:这可能是一个问题,假设你试图点击一下。

 function GeneratePermutation() { splitted = AnagramObj.NextPermutation(splitted); if (splitted!=null) $('#AnagramTxtArea').append(splitted.join("") + " "); else //$('#StopBtn').click(); // should be $('#StopBtn').trigger('click'); }