Javascript输入超时

Javascript输入超时,javascript,settimeout,Javascript,Settimeout,我有很多文本框(几十个),当用户更改值时需要触发事件。我的用户请求不使用提交按钮,他们也不想激活其他控件来触发事件。据我所知,这意味着我只能在oninput事件中运行我的方法。我的问题是,我不想在每次按键时都运行该方法——我想等待一段时间,然后再假设用户在提交更改之前完成了键入。例如,其中一个输入框正在查找数字。如果用户在“120”中键入,我不希望该方法为“1”触发一次,为“12”再次触发,然后为“120”触发第三次 目前我有一个函数,它使用setTimeout将响应延迟一秒钟,以便用户完成信息

我有很多文本框(几十个),当用户更改值时需要触发事件。我的用户请求不使用提交按钮,他们也不想激活其他控件来触发事件。据我所知,这意味着我只能在
oninput
事件中运行我的方法。我的问题是,我不想在每次按键时都运行该方法——我想等待一段时间,然后再假设用户在提交更改之前完成了键入。例如,其中一个输入框正在查找数字。如果用户在“120”中键入,我不希望该方法为“1”触发一次,为“12”再次触发,然后为“120”触发第三次

目前我有一个函数,它使用setTimeout将响应延迟一秒钟,以便用户完成信息输入。如果用户在这一秒窗口内输入另一个字符,倒计时将重新开始

function CombineTextEntries(ctrl, FunctionObj){
    // This function prevents a text box from updating the Layout until the UpdateDelay time has been reached

    if (typeof(this.UpdateDelayTimeout) !== "undefined"){
        window.clearTimeout(this.UpdateDelayTimeout);
    }

    this.UpdateDelayTimeout = setTimeout( function(){FunctionObj();}, 1000);
}
我通过将html的oninput属性设置为

oninput="CombineTextEntriesWithArg(this, MyFunction)"
我遇到的问题是一些函数需要一个或多个参数。我可以创建一个不同的函数处理程序,例如

function CombineTextEntriesWithArg(ctrl, FunctionObj, Arg){
    if (typeof(this.UpdateDelayTimeout) !== "undefined"){
        window.clearTimeout(this.UpdateDelayTimeout);
    }

    this.UpdateDelayTimeout = setTimeout( function(){FunctionObj(Arg);}, 1000);
}
这样称呼它:

oninput="CombineTextEntriesWithArg(this, MyFunction, MyArg)"
但这似乎有点含糊不清。有人能提出更好的解决方案吗?传递包含枚举参数的对象是最好的方法吗?对此我唯一的犹豫是,我需要编辑我需要调用的每个函数来接受单个对象,这有点麻烦。

您可以使用它来简化参数传递

function CombineTextEntries(ctrl, fnc, args){

    if (ctrl.updateDelayTimeout ){
        window.clearTimeout(ctrl.updateDelayTimeout );
    }

    ctrl.updateDelayTimeout = setTimeout( function(){fnc.apply(this, args);}, 1000);
}
叫它

CombineTextEntries(this, yourFunctionName);
CombineTextEntries(this, yourFunctionName, [argument1]);
CombineTextEntries(this, yourFunctionName, [argument1, argument2]);

要继续@Teemu所说的,您应该在代码中钩住处理程序。您可以使用Function.bind()实现这一点。谢谢,伙计!我感谢你的帮助!