繁体   English   中英

我不能让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

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

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

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM