代码之家  ›  专栏  ›  技术社区  ›  Keith Palmer Jr.

javascript:触发一个在几秒钟内发生的事件,但如果另一个事件发生,是否能够取消该事件?

  •  2
  • Keith Palmer Jr.  · 技术社区  · 16 年前

    免责声明:我只是一个javascript专家,所以我甚至不确定我是否正确地接近这一点…

    我希望能够在javascript中触发一个事件,但如果发生另一个事件,也可以取消该事件。所以,我想实现的是:

    • 用户开始在文本框中键入。
    • 当文本框内容更改时,触发一个事件,使Ajax调用
    • 但是,如果用户继续输入,请取消该事件,因为我不想在输入完成之前进行查询

    也就是说,如果用户在中键入“foobar”,我不想在输入完成之前执行Ajax搜索。我没有理由这样做:

    AJAX(“F”) 然后 AJAX(“FO”) 然后 AJAX(“FO”) 然后 AJAX(FOOB) …

    当他们打字的时候我本可以打一个电话的时候 Ajax(“foobar”)。

    …我说得有道理吗?还是有更好的方法来解决这个问题?

    噢,还有更重要的是:我想避免jquery/prototype,只使用直接的javascript就可以做到这一点……哎呀!

    3 回复  |  直到 16 年前
        1
  •  3
  •   David Hedlund    16 年前

    你想在按键上做的是

    if(myTimeout)
       window.clearTimeout(myTimeout);
    
    var myTimeout = window.setTimeout(function() {
       alert('one second has passed without any keypress');
    }, 1000);
    
        2
  •  2
  •   Pekka    16 年前

    如果您不想使用框架,您可能希望查看TA独立的Ajax库,比如 Matt Kruse's .

    我认为可以中止Ajax请求。然而,每次按键启动和中止请求对我来说都是可怕的。

    我会走另一条路:

    • 在发送请求之前等待一段时间(检查输入值是否从那时起发生了更改,如果没有,则发出请求)

    • 让每个Ajax请求成功通过,但是标记每个请求的输入值。只有当输入的当前值和请求的标记相同时,才执行您的操作并显示结果。否则,您会悄悄地放弃结果。

        3
  •  0
  •   Ramuns Usovs    16 年前

    像这样:

    var to = null; //the timeout
    function doStuffWithContents(){
       //code that does the ajax goes here
    }
    
    document.getElementById('the_textarea').onkeyup = function(){
      if (to) {
        window.clearTimeout(to);
      }
      to = window.setTimeout("doStuffWithTheContents()",1000); //1000 = one second
    }