如何检测jquery触发器事件完成?

时间:2012-07-19 15:46:16

标签: javascript jquery javascript-events

我正试图触发第二个依赖于第一个事件的事件:

...
$('#productFamilyId').val(data.contents.productfamily);
$('#productFamilyId').trigger('change', function() {
    $('#productId').val(data.contents.product);
    $('#productId').trigger('change');
});

在尝试触发第二个事件之前,它不会等待第一个触发器完成。是否可以等待第一次触发完成?

4 个答案:

答案 0 :(得分:2)

可能你想要这个:

$('#productFamilyId').trigger('change', function() {
   $('#productId').val(data.contents.product);
   setTimeout(function(){ 
      $('#productId').trigger('change'); 
   },1);
});

答案 1 :(得分:1)

你可以使用javascripts setTimeout()函数,这样函数会在一段时间后执行。

$('#productFamilyId').val(data.contents.productfamily);
$('#productFamilyId').trigger('change', function() {
setTimeout( function(){       
$('#productId').val(data.contents.product);
    $('#productId').trigger('change');
},100);
});

答案 2 :(得分:1)

触发方法没有回调。额外的参数就是 - 参数。

http://api.jquery.com/trigger/

您实际在做的是在第二个函数中运行代码,然后将结果作为参数传递给由trigger调用的事件处理程序。如果希望它们按顺序运行,则需要在第一个事件的事件处理程序中触发第二个事件。

答案 3 :(得分:1)

如果您的事件处理程序未执行异步调用,则触发事件将执行并完成,然后才会转到下一行。 JsFiddle

$('#productFamilyId').val(data.contents.productfamily);
$('#productFamilyId').trigger('change');
// Execute after change complete
$('#productId').val(data.contents.product);
$('#productId').trigger('change');

在事件处理程序中使用异步调用(setTimeOut,Ajax等),您可以执行以下操作:JsFiddle

在事件处理程序中添加一个回调函数作为参数:

$("#productFamilyId").change(function(e, callback) {
    // Simulating ajax
    setTimeout(function() {
        if (typeof callback === "function")
            callback();
    }, 3000);
});

然后触发:

$('#productFamilyId').trigger('change', function() {
    $('#productId').val(data.contents.product);
    $('#productId').trigger('change');
});