【问题标题】:On Key Up vs On Change with AJAX queries: which is better?On Key Up 与 On Change with AJAX 查询:哪个更好?
【发布时间】:2012-10-12 11:28:08
【问题描述】:

我将 POST 数据从文本框发送到 PHP 页面进行处理。 AJAX 不是用户点击保存按钮,而是用于文本框事件。

我在使用 onChange 或 onKeyUp 之间纠结。

OnKeyUp 需要在服务器上进行更多处理,因为每次按键我的脚本都必须访问数据库并进行更改。服务器性能可能是个问题。

OnChange 是首选,因为它仅在用户完成该框时才发送更改。但是存在一个问题,如果使用时不取消选择文本框,则不会发生'onChange'事件,因此不会保存更改。

哪个最好?或者有没有办法在用户不取消选择框的情况下强制执行“onChange”?

【问题讨论】:

  • 你可以使用api.jquery.com/keypress,它类似于onKeyUp,但它是用于用户输入的。如果您在用户停止小费两秒钟后进行更改怎么办?
  • 好主意。我会试试时间延迟。我很想使用 jQuery,但不能因为它用于大学项目
  • @DanielOakey:请检查下面的答案,看看是否适合你.. :)

标签: javascript php jquery ajax javascript-events


【解决方案1】:

您甚至可以使用 KeyUp 按下 ajax 调用,如何? 只需在 keyUp 事件上添加 delayKeyUp 函数,并且 delayKeyUp 函数具有 setTimeout 方法,这将真正帮助您解决服务器处理问题,

注意:这一次只适用于一种方法。

例如。代码:

更新:

$("selector").live('keyup', function(e) { //if jquery v1.7 or more then you can use .on event instead of .live
    delayKeyUp(function(){ ---Your Server Call Stuff -----}, 350); //delay of 350ms.
    return false;
});


var delayKeyUp = (function(){
     var timer = 0;
     return function(callback, ms){
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
     };
})();

【讨论】:

  • 这对多个 ajax 查询不起作用吧?即delayKeyUp(foo, 100); delayKeyUp(bar, 200);他们将共享同一个'timer'对象,并给彼此造成问题
  • .live() 自 jQ 1.7 起已弃用,应替换为 .on() - api.jquery.com/live - 此外,@AlanFoster 这将适用于多个调用,因为称为闭包 - 试图理解这些会让你头疼,所以最好通过尝试向自己证明这一点,然后暂时搁置它:P 虽然它们很重要,但请在某个时候查看它们
  • @Joe 我是说这不起作用/因为/关闭哈哈。由于返回了一个函数对象,并且它仍然可以访问单个外部计时器对象,这意味着它会导致问题......对吗? :o
  • @AlanFoster:这适用于一次一个服务器调用,当然,它也需要一些工作才能实现多个服务器调用。
  • @Niks 发布一个适用于大量回调的解决方案,我会给你我的支持 :)
【解决方案2】:

在什么情况下用户不会模糊文本框,导致 AJAX 不发生?

一种可能的解决方案是为 keyDown 和 keyUp 设置超时,以便在一段时间没有输入之后,AJAX 将触发,类似于这些行。这可能有一个错误,如果您在该文本框的 $.ajax 运行之前开始输入另一个文本框,它可能不会更新文本框,但您应该能够理解

var key_is_down = false,
    key_timeout;

$(el).on('keyDown', function () {
    key_is_down = true;
}).on('keyUp', function () {
    key_is_down = false;
    key_timeout = setTimeout(function(){ runAjax($(this)); }, 2500);
});

function runAjax ($el) {
    if (key_is_down) {
        key_timeout = setTimeout(function(){ runAjax($el); }, 2500);
    } else {
        // $.ajax...
    }
}

【讨论】:

  • 我也刚刚看到您对 OP 的评论,即无法使用 jQ - 请记住 jQ 只是 Javascript,封装得很好。如果你不能使用 jQ,你可能只是从源代码中去 nick .on(),并将它重新定义为一个你可以使用的函数:P 显然 $() 只是变成了 document.getElementById()
  • 如果这是他们最后一次编辑,他们不会模糊文本框。例如:他们进行更改,然后关闭页面。最后一个文本框在他们退出时仍然保持焦点,因此没有保存。
  • 所以另一种解决方案是将$('input:focus').trigger('change')绑定到window.onbeforeunload :)
【解决方案3】:
window.page_loaded = new Date();
$('text_field').bind('keyup', function(){
    var timeout_seconds = 10;

    var last_check = $(this).data('last_checked');
    last_check = last_check ? last_check : window.page_loaded;
    var curr_time = new Date();
    curr_time = new Date(curr_time.getTime() - (timeout_seconds * 1000));
    if(last_check < curr_time){
        //now do the checking
    }
});

【讨论】:

  • 我们不能在这里利用闭包方法的帮助,而不是做一些粗略的方法来实现它吗? :)
  • @Niks :使用闭包是否有意义?伙计,这不是一个粗略的方法,用户想要一些超时来与服务器交互,这就是我的代码所做的。 :)
  • 看上面的答案并观察一下,看起来更专业和通用。
  • @Niks:教授????一个是使用 depriciated func,另一个是设置超时,但所有调用将在超时后的每个 keyup 上发送到服务器!!!!!!
猜你喜欢
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 2015-08-03
相关资源
最近更新 更多