如何等待单击事件完成
How can I wait for a click event to complete
我在元素中添加了一个点击事件处理程序
$(".elem").click(function(){
$.post("page.php".function(){
//code1
})
})
然后我触发点击事件
$(".elem").click();
//code2
我如何确保code2在code1执行之后执行
(忽略WebWorkers)JavaScript在单个线程上运行,因此可以确保code2始终在code1之后执行。
除非您的code1执行异步操作,如Ajax调用或setTimeout()
,在这种情况下,触发的单击处理程序将完成,然后code2将执行,然后(最终)将运行Ajax调用(或setTimeout()
,或其他)的回调。
EDIT:对于您更新的问题,code2将始终在code1之前执行,因为正如我上面所说,异步Ajax回调将在稍后发生(即使Ajax响应非常快,它也不会调用回调,直到当前JS完成)。
"如何确保代码2在代码1执行后执行"
使用不带参数的.click()
是.trigger("click")
的快捷方式,但如果您实际显式调用.trigger()
,则可以提供将传递给处理程序的其他参数,从而可以执行以下操作:
$(".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()
文档。)
演示:http://jsfiddle.net/nnnnnn/ZbRJ7/1/
您可以尝试这样写:
$(".elem").live("click", function(){
//code1
})
// for newer jquery version from 1.9
$(".elem").on("click", function(){
//code1
})
而且,您的触发器将始终执行为已启动。
将code2
封装在方法中,并将其作为回调添加到code1
中,这样它将始终在code1
执行后被调用
code2 = function(){/*code2*/};
$(".elem").click(function(){
//code1
code2();
})
Javascript的执行是逐行执行的。因此,无论发生什么,都将首先执行。因此,在其他方法之前添加click代码将起作用。
另外,如果有任何异步调用,那么获取一个只有在得到响应时才设置的标志。
var点击=false;$('#elem').click(function(){//做一些异步进程点击=true;});
while(!点击){//无所事事}
//称为的其他功能
或者第二个选项是,如果使用post方法,则在属性中设置async=true。
- 将单击事件添加到数据表
- 将单击事件添加到附加的项目中
- 在IE8中不起作用的元素上触发单击事件
- 链接上的IE10 jquery句柄单击事件不起作用
- 如何使用纯 JavaScript 在所有浏览器中区分左/右/中键单击事件
- 如何在master中调用细节网格作为单击事件
- 兰吉 |如何在 span 标签上使用单击事件删除突出显示的文本
- 如何隐藏按钮单击事件上的占位符
- 复选框,然后单击事件处理
- 如何使用for循环添加所有按钮'单击事件
- 手柄'img'单击事件并插入'alt'使用jQuery将属性转换为文本框
- 覆盖单击事件不起作用
- 单击事件打开两个弹出菜单
- 单击事件不起作用
- 从其他元素上的单击事件访问image src属性
- 单击事件中的ajax请求后重定向
- 如何缩放地图框传单中的标记单击事件
- 在没有焦点的情况下捕获画布上的第一次单击事件
- 通过单击事件识别画布上的对象
- 如何将单击事件添加到JQuery中动态添加的元素中