我不能让setInterval()在Javascript中工作
I can't get setInterval() to work in 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:
<div id="content">
<input id="anagram" type="text" placeholder="Insert your text here" maxlength="80"/> <br />
<input id="SubmitBtn" type="submit" value="submit" />
<br />
<textarea id="AnagramTxtArea" readonly="readonly"></textarea>
</div>
编辑:还有一个问题:
调用$('#StopBtn')时,click()代码在click事件函数存在后继续执行。所以我在一个无限循环中。
您需要将函数对象本身传递给setInterval()
,而不是函数调用的结果:
t = setInterval(GeneratePermutation,10);
// ^ No parentheses
EDIT:关于第二个问题,您可以做的是检查间隔是否正在运行。如果是,那么取消它:
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是一个唯一的间隔ID,你可以传递给clearInterval()。
- func是您希望被重复调用的函数。 中的代码
- 替代语法,是要执行的代码字符串反复。(不建议使用此语法使用eval()的原因是延迟的毫秒数(千分之一秒)setInterval()函数应该等待的时间在每次调用函数之前。与setTimeout一样,也有最小值延迟执行。
这可能是一个问题,假设您正在尝试触发一个点击。
function GeneratePermutation() {
splitted = AnagramObj.NextPermutation(splitted);
if (splitted!=null)
$('#AnagramTxtArea').append(splitted.join("") + " ");
else
//$('#StopBtn').click();
// should be
$('#StopBtn').trigger('click');
}
相关文章:
- 在表单提交将DOM的一部分替换为分部之后,我应该将ajax成功绑定到什么来使我的javascript工作
- 我可以'不要让Javascript工作不正常
- 如何让我的html5功能不兼容警告使用javascript工作
- Excel Web Services 电子邮件 JavaScript 工作表
- 用于Google Fusion Table层的Javascript工作,但试图整理代码
- Bootstrap:如何附加一个类,并且仍然有BS Javascript工作
- JavaScript 工作队列
- JavaScript工作,直到我添加这个&&陈述
- 为什么不'在CasperJS中没有简单的JavaScript工作
- 如何"递归AJAX回调”;在JavaScript工作中
- 基本验证javascript工作不正常
- 需要帮助让这个字符串的Javascript工作
- HTML和JavaScript工作不正常
- 下拉菜单无法从CSS或Javascript工作
- 需要从erb生成一个非常特定的html来让javascript工作
- 如果javascript代码段未使用,它将阻止其他javascript工作
- 将内联事件处理程序移动到chrome扩展的javascript工作表
- 阻止其他Javascript工作的Javascript
- iframe阻止javascript工作
- 无法获取切换函数(JavaScript工作)