Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.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,我有一个关于JavaScript(侦听器)方法执行顺序的问题。虽然我理解下面的代码可能不是最佳实践,但有没有办法保证当btn1发生变化时,下面的函数将触发的顺序 $(function() { $('#btn1').change(function(){ doStuff(); }); }); $(function() { $(#btn1, btn2).change(function(){ doMoreStuff()

我有一个关于JavaScript(侦听器)方法执行顺序的问题。虽然我理解下面的代码可能不是最佳实践,但有没有办法保证当btn1发生变化时,下面的函数将触发的顺序

  $(function() {
    $('#btn1').change(function(){
            doStuff();
    });
  });

  $(function() {
    $(#btn1, btn2).change(function(){
            doMoreStuff();
    });
  });
例如,根据JS代码“出现的顺序”(即在实际的JS/html文件中列出),是否可以断言(当btn1发生变化时): 1.doStuff()将首先执行 2.doStuff()将在调用doMoreStuff()之前完全完成,假设doStuff所做的一切都是更新DOM

我有一个真实的例子,其中doStuff更新DOM,doMoreStuff使用更新后的DOM值调用Ajax端点,并且希望确保doStuff始终首先被调用(同样基于它首先被“列出”的古怪设计)

谢谢,
Damien据我所知,jQuery确保事件处理程序按照创建顺序(先进先出)启动。目前我找不到任何关于这方面的文档,但我相信我在过去的某个地方读过

只要您的第一个
change
函数不是异步的,那么第一个函数应该在第二个函数开始之前完成执行。我们可以通过在第一个
change
函数中添加一个循环来测试这一点:

$(函数(){
$('#btn1')。更改(函数(){
log(“在”+(new Date())触发的第一个更改事件);
对于(变量i=0;i<100000000;i++)
继续;
log(“第一个更改事件在”+(new Date())完成);
});
});
$(函数(){
$('#btn1,#btn2')。更改(函数(){
log(“在“+(new Date())”触发的第二个更改事件);
});
});

12

12
据我所知,事件侦听器被添加到队列中,因此当侦听的事件发生时,它们会按照声明的顺序被调用。尽管事件冒泡会影响顺序,但需要注意的是。在这种情况下,当然没有事件冒泡。“只要您的第一个更改函数不是异步的”,它就不是。不过,声明的“第二个”函数确实调用了Ajax。我很想得到你提到的那个医生。这段代码是prod代码的代表,在prod代码中,Ajax调用的系统日志将意味着第一个函数尚未完成。@Damo我认为这是jQuery必须从其文档中删除的内容。很遗憾,我找不到任何官方链接。