Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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_Jquery - Fatal编程技术网

Javascript 具有去抖动/节流功能的奇怪行为

Javascript 具有去抖动/节流功能的奇怪行为,javascript,jquery,Javascript,Jquery,每次文本框值更改时,我都需要调用一个函数。但是,它初始化了一个AJAX调用,因此我不需要在每次击键时都运行脚本 我编写了以下函数作为概念证明: $(document).ready(function() { var scheduledChange; function triggerLinkChange(value, debounce) { clearTimeout(scheduledChange); scheduledChange = setTime

每次文本框值更改时,我都需要调用一个函数。但是,它初始化了一个AJAX调用,因此我不需要在每次击键时都运行脚本

我编写了以下函数作为概念证明:

$(document).ready(function() {
    var scheduledChange;
    function triggerLinkChange(value, debounce) {
        clearTimeout(scheduledChange);
        scheduledChange = setTimeout(function(val) {
            alert("value: "+val);
        }(value), debounce);
    }
    $('input').keyup(function(){
        triggerLinkChange($(this).val(),3000);
    });
});
不幸的是,延迟似乎没有正常工作。我不确定到底是什么问题,因为第一次通话似乎有点延迟(可能),但每次按键都会触发


有什么想法吗?

似乎太复杂了

$('input').keyup(function(){
    var self = this;

    clearTimeout( $(this).data('timer') );

    $(this).data('timer', setTimeout(function(){
        // do ajax, 3 seconds seems like lot here

        $.get('url', {value : self.value}, callback);

    }, 3000));

});

看起来太复杂了

$('input').keyup(function(){
    var self = this;

    clearTimeout( $(this).data('timer') );

    $(this).data('timer', setTimeout(function(){
        // do ajax, 3 seconds seems like lot here

        $.get('url', {value : self.value}, callback);

    }, 3000));

});

一种更简单的方法是使用这样的变量(伪代码,因为我只是在这里输入):


一种更简单的方法是使用这样的变量(伪代码,因为我只是在这里输入):


您正在立即调用您在超时中声明的函数,而不是将其传递给函数

但是,它实际上可以在不绑定或不向函数传递
值的情况下工作,因为变量无论如何都在作用域中:

    scheduledChange = setTimeout(function() {
        alert("value: " + value);
    }, debounce);

下面是一个示例:

您正在立即调用您在超时中声明的函数,而不是将其传递给函数

但是,它实际上可以在不绑定或不向函数传递
值的情况下工作,因为变量无论如何都在作用域中:

    scheduledChange = setTimeout(function() {
        alert("value: " + value);
    }, debounce);

下面是一个示例:

看看,它应该可以解决您的问题。
setTimeout
中的第一个参数未定义,因为该函数将在函数表达式导致立即执行该函数后返回未定义的。(值)。看看,它应该可以解决您的问题。
setTimeout
中的第一个参数是未定义的,因为在函数表达式导致函数立即执行后,该函数将返回未定义的。(值)。没有骰子。。。这将发送去盎司周期开始时的值。因此,如果我键入Hello并花5秒钟,triggerLinkChange函数会收到“Hel”,因为“l”和“o”的键被阻止。哦,我明白了,你想像自动完成一样完成吗?我会更新我的答案。没有骰子。。。这将发送去盎司周期开始时的值。因此,如果我键入Hello并花5秒钟,triggerLinkChange函数会收到“Hel”,因为“l”和“o”的键被阻止。哦,我明白了,你想像自动完成一样完成吗?我会更新我的答案。@gregschope没问题@格雷斯切普,没问题!感谢您的增强,为我节省了一个全局变量。我喜欢这个解决方案,但不幸的是,我仍然需要打开一个函数,因为这是一个UFD组合框,我需要在一些不同的情况下触发更改。感谢为我节省了一个全局变量的增强。我喜欢这个解决方案,但不幸的是,我仍然需要打开一个函数,因为这是一个UFD组合框,我需要在一些不同的情况下触发更改。