在jQuery中完全执行在“焦点”事件之后如何在“更改”事件上强制运行代码

时间:2019-07-17 21:41:42

标签: javascript jquery

在我的jQuery脚本中,我需要组合框:

  1. focus事件中,运行代码以便在用户更改此<select>内部的值之前获取所有值。
  2. change事件中,运行代码取决于focus事件期间构建的json对象

脚本

var previousDataObject = [];

$('body').on('focus', "select.my-combobox", function () {
     comboboxChangeInit(); // it fills previousDataObject up;  
}).on( "change", "select.my-combobox", function(){ 
     //here code using previousDataObject 
});

基本jQuery行为将在用户操作上运行focuschange

对于我来说,我需要等待comboboxChangeInit()完全填充previousDataObject才能在change事件上运行代码。

如何创建一种侦听器来执行此操作?

2 个答案:

答案 0 :(得分:0)

您可以改用trigger,所以

$('body').on('focus', "select.my-combobox", function () {
     comboboxChangeInit(); // it fills previousDataObject up;
     $(this).trigger('change')
}).on( "change", "select.my-combobox", function(){ 
     //here code using previousDataObject 
});

trigger将触发作为参数传递的事件,请检查jQuery Docs

答案 1 :(得分:0)

我发现了一个基于递延对象的解决方案,谢谢this question

jQuery

var previousDataObject = [];

var previousDataDeferred;

$('body').on('focus', "select.my-combobox", function () {
     comboboxChangeInit(); // it fills previousDataObject up.  
}).on( "change", "select.my-combobox", function(){ 
   var myObject = $(this); 
   $.when( previousDataDeferred ).done(function(){ 
         //Display spinner for example
         //here code using myObject and previousDataObject.
         //Remove spinner and reset previousDataObject  
   });
});

function comboboxChangeInit(){
   previousDataDeferred = $.Deferred();
   //Code to fill previousDataObject up.
   previousDataDeferred.resolve();
});