Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过在参数中传递停止函数来清除间隔?_Javascript - Fatal编程技术网

Javascript 通过在参数中传递停止函数来清除间隔?

Javascript 通过在参数中传递停止函数来清除间隔?,javascript,Javascript,我正在流式传输ajax调用,如果按下“left”键,我想停止流。但是,这个函数stream\u ajax是我在整个代码中多次使用的模板,因此我想传递一个clearInterval语句来检测是否按下了“left”键 function stop() { $(document).keydown(function(e) { if(e.keyCode == 37) { return false; } }); } function s

我正在流式传输ajax调用,如果按下“left”键,我想停止流。但是,这个函数
stream\u ajax
是我在整个代码中多次使用的模板,因此我想传递一个
clearInterval
语句来检测是否按下了“left”键

function stop() {
    $(document).keydown(function(e) {
        if(e.keyCode == 37) {
            return false;
        }
    });
}

function stream_ajax(callback, stop) {
    stream = setInterval(
        function(){
            // get page
        },
        10000
    );
    if(stop() == false) {
        clearInterval(stream);
    }
}
我的代码似乎不起作用,我能够通过相同的方法让回调正常工作。有人知道为什么这不起作用吗?

您的
stop()
函数没有显式返回值,这意味着它总是返回
未定义的
。您拥有的
返回false
在keydown处理程序函数中,而不是
stop()
的一部分。
.keydown()
方法分配一个新的keydown处理程序,它不测试过去是否按下过键

你可以这样做:

function stream_ajax(callback, stop) {
    var stream = setInterval(
        function(){
            // get page
        },
        10000
    );
    $(document).keydown(function(e) {
        if(e.keyCode == 37) {
            clearInterval(stream);
            $(document).off("keydown");
        }
    });
}

也就是说,在设置间隔后立即绑定一个keydown处理程序,如果您关心的键被按下,则在该处理程序中清除间隔并删除keydown处理程序。

您将希望将流传递到
stop
,并在keydown处理程序中执行
clearInterval
,如下所示:

function stop(stream) {
    $(document).keydown(function(e) {
        if(e.keyCode == 37) {
            clearInterval(stream);
        }
    });
}

function stream_ajax(callback, stop) {
    stream = setInterval(
        function(){
            // get page
        },
        10000
    );

    if (stop)  // in case no stop function was passed in
      stop(stream);
}

我真的很感激这个答案,我希望有一个完全的外部功能,所以保罗·鲁布得到了正确的答案。谢谢你抽出时间,我真的很感激+1.比我的答案更接近原始代码。请注意,如果反复调用
stop()
,它将绑定越来越多的keydown处理程序,因此最好在
.keydown()之前包含对
.off()
的调用。
@nnnnnn我不确定我是否理解,你是说你在代码中做了什么?如果我在
clearInterval(流)之后使用return false
会是相同的吗?
$(document).off(“keydown”).keydown(…
或类似于我的回答中的内容。返回false会取消当前事件的默认行为,但不会删除处理程序。