1

我正在流式传输 ajax 调用,如果按下“左”键,我想停止流式传输。然而,这个函数stream_ajax是一个模板,我在我的代码中多次使用它,所以我想传递一个clearInterval语句来检测是否按下了“左”键。

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

我的代码似乎不起作用,我能够通过相同的方法让回调工作。有谁知道为什么这不起作用?

4

2 回答 2

2

您需要将流传递给stop,并clearInterval在 keydown 处理程序中执行,如下所示:

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);
}
于 2013-04-30T21:42:27.223 回答
1

您的stop()函数没有显式返回值,这意味着它始终返回undefined. 您拥有的return 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 处理程序。

于 2013-04-30T21:41:31.507 回答