首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何等待单击事件完成

如何等待单击事件完成
EN

Stack Overflow用户
提问于 2012-08-03 14:13:11
回答 4查看 73K关注 0票数 19

我向元素添加了一个单击事件处理程序

代码语言:javascript
复制
 $(".elem").click(function(){
       $.post("page.php".function(){
         //code1
      })
 })

然后我触发了一个点击事件

代码语言:javascript
复制
$(".elem").click();
//code2

如何确保在code1执行之后执行code2

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-03 14:15:45

(忽略WebWorkers) JavaScript在单线程上运行,因此您可以确保code2将始终在code1之后执行。

除非您的code1执行一些异步操作,如Ajax调用或setTimeout(),在这种情况下,触发的单击处理程序将完成,然后code2将执行,然后(最终) Ajax调用(或setTimeout()等)的回调将运行。

编辑:对于您更新的问题,code2将始终在code1之前执行,因为正如我在上面所说的,异步Ajax回调将在稍后发生(即使Ajax响应非常快,在当前JS完成之前它也不会调用回调)。

“如何确保code2在code1执行后执行”

使用不带参数的.click().trigger("click")的快捷方式,但如果您实际显式调用.trigger(),则可以提供额外的参数,这些参数将被传递给处理程序,这使您可以执行以下操作:

代码语言:javascript
复制
$(".elem").click(function(e, callback) {
    $.post("page.php".function(){
      //code1

      if (typeof callback === "function")
         callback();
   });
});

$(".elem").trigger("click", function() {
    // code 2 here
});

也就是说,在单击处理程序中,测试是否在callback参数中传递了函数,如果是,则调用该函数。这意味着当事件“自然”发生时,将不会有回调,但当您以编程方式触发它并传递函数时,该函数将被执行。(请注意,使用.trigger()传递的参数不一定是函数,它可以是任何类型的数据,并且可以传递多个参数,但出于这个目的,我们需要一个函数。有关详细信息,请参阅.trigger() doco。)

演示:http://jsfiddle.net/nnnnnn/ZbRJ7/1/

票数 17
EN

Stack Overflow用户

发布于 2012-08-03 14:17:50

你可以试着这样写:

代码语言:javascript
复制
 $(".elem").live("click", function(){
  //code1
 })

 // for newer jquery version from 1.9
 $(".elem").on("click", function(){
  //code1
 })

而且,您的触发器将始终以已触发的方式执行。

票数 3
EN

Stack Overflow用户

发布于 2012-08-03 14:19:30

code2包装在方法中,并将其作为回调添加到code1中,以便始终在code1执行后调用它

代码语言:javascript
复制
code2 = function(){/*code2*/};
$(".elem").click(function(){
  //code1
  code2();
 })
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11790241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档