我能';无法让setInterval()在Javascript中工作

我能';无法让setInterval()在Javascript中工作,javascript,jquery,setinterval,Javascript,Jquery,Setinterval,我有一个算法,可以生成给定单词的排列。我试图使用setInterval()生成下一个置换,但函数只运行一次!我不明白为什么。我没有收到任何错误消息。 这是我的密码 var splitted; var t; $(document).ready(function() { $('#SubmitBtn').click(function() { //change Start to Stop and change button id $('#SubmitBtn').attr('id','S

我有一个算法,可以生成给定单词的排列。我试图使用
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
编辑:关于第二个问题,您可以做的是检查间隔是否正在运行。如果是,则取消:

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()时执行
generatePermutate()

必须将函数传递给setInterval()。改为这样做:

t = setInterval(GeneratePermutation, 10);

必须传入函数名或匿名函数作为setInterval的第一个参数。参见MDN参考

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');

    }

你确定
$('#StopBtn')。click()
正在启动吗?在函数中抛出一个
alert()
console.log()
。看到我的编辑了吗?是的,正在发射。我在chrome中使用了断点,但是当它到达click函数的末尾时,代码继续运行execute@DanDinu当前位置我用第二个问题的解决方案更新了我的答案。效果很好,但我真的不明白为什么。您正在将按钮id更改为StopBtn并调用$('#StopBtn')。请单击GeneratePermtion()中的()。为什么它仍然触发SubmitBtn.click()?这是另一个id…@DanDinu:虽然它是一个不同的id,但它仍然是相同的元素。click处理程序绑定到元素。我明白了,但是(按照我的逻辑)我不应该更改id,只应该更改从Submit到Send和viceversa的文本值。但是它不起作用…@DanDinu:只要修改文本就行了。我不知道为什么它对你不起作用。可能需要再次检查是否用新ID替换了所有出现的原始ID。
t = setInterval(function() { /* code */ }, 10);
var intervalID = window.setInterval(func, delay[, param1, param2, ...]);
var intervalID = window.setInterval(code, delay);
function GeneratePermutation() {
        splitted = AnagramObj.NextPermutation(splitted);
        if (splitted!=null)
            $('#AnagramTxtArea').append(splitted.join("") + " ");       
        else  
            //$('#StopBtn').click();
            // should be
            $('#StopBtn').trigger('click');

    }