我有2个事件需要异步触发,因为第二个事件依赖于第一个事件。jquery fire 2异步触发事件
目前我有:
$(document).ready(function() {
$("#CourseID").trigger('change');
$("#ClearAll").trigger('click');
});
这里有2个事件:
$('#CourseID').change(function() {
alert('Inside CourseID change event');
Required(document.getElementById('CourseID').value, 'CourseID', 'err_CourseID');
// Get Hole information & display in Holes
var CourseID = document.getElementById('CourseID').value;
document.getElementById('db_CourseID').value = CourseID;
if(CourseID.length<1) {
var holes = document.getElementById('num_holes').value;
for(i=1; i<=holes; i++) {
id = "holes_"+i;
$('#'+id).prop('checked', false);
}
document.getElementById('num_holes').value = 0;
document.getElementById('hole_error').style.display = "inline";
document.getElementById('holes').style.display = "none";
document.getElementById('front9').style.display = "none";
document.getElementById('mid9').style.display = "none";
document.getElementById('back9').style.display = "none";
document.getElementById('ClearAll').style.display = "none";
document.getElementById('SelectAll').style.display = "none";
chkCheckboxes();
return;
} else {
document.getElementById('hole_error').style.display = "none";
document.getElementById('holes').style.display = "inline";
// Select All Holes
var holes = document.getElementById('num_holes').value;
for(i=1; i<=holes; i++) {
id = "holes_"+i;
$('#'+id).prop('checked', true);
}
}
$.ajax({
url: "/P3Live/_includes/php/get_playable_holes.php",
type: "post",
dataType: 'json',
data: {CourseID: CourseID},
success: function(response) {
if (response.status == "success") {
// We need to clear the existing div so when we append it is doing so to an empty field
$('#holes').empty();
var str = response.message + ''; /* We add the blank space to assure it is recognized as a string */
var holes = str.split(",");
var sections = holes.length/9;
alert('Setting num_holes');
document.getElementById('num_holes').value = holes.length;
for(i=0; i<sections; i++) {
for(j=0; j<9; j++) {
holeNum = (i*9)+j;
if(holes.length<holeNum) { continue; }
addCheckbox(holes[holeNum]);
id='holes_'+holes[holeNum];
}
var html = $("#holes").html();
html = html + "<br />"; // creates a new line after each section of 9 holes
$("#holes").html(html);
}
// We need to have the entire holes div populated before we can check the boxes
for(i=0; i<holes.length; i++) {
id='holes_'+holes[i];
$("#"+id).prop("checked", true);
}
chkCheckboxes();
// Now let's setup which buttons should be visible
switch (sections) {
case 0:
document.getElementById('front9').style.display = "none";
document.getElementById('mid9').style.display = "none";
document.getElementById('back9').style.display = "none";
document.getElementById('ClearAll').style.display = "none";
document.getElementById('SelectAll').style.display = "none";
break;
case 1:
document.getElementById('front9').style.display = "inline";
document.getElementById('mid9').style.display = "none";
document.getElementById('back9').style.display = "none";
document.getElementById('ClearAll').style.display = "inline";
document.getElementById('SelectAll').style.display = "inline";
break;
case 2:
document.getElementById('front9').style.display = "inline";
document.getElementById('mid9').style.display = "none";
document.getElementById('back9').style.display = "inline";
document.getElementById('ClearAll').style.display = "inline";
document.getElementById('SelectAll').style.display = "inline";
break;
case 3:
document.getElementById('front9').style.display = "inline";
document.getElementById('mid9').style.display = "inline";
document.getElementById('back9').style.display = "inline";
document.getElementById('ClearAll').style.display = "inline";
document.getElementById('SelectAll').style.display = "inline";
break;
}
} else {
alert(response.message);
}
},
error: function(response) {
for (var k in response){
if (typeof response[k] !== 'function') {
console.log("Key is " + k + ", value is " + response[k]);
}
}
}
});
})
此事件从另一个领域采取CourseID并从数据库中获取关于孔的数量信息。然后,它会为每个孔创建复选框并默认进行检查。它还设置了一些按钮的显示状态。其中之一,是我想要触发的次要事件。
$("#ClearAll").click(function() {
var holes = document.getElementById('num_holes').value;
alert('Inside ClearAll Event. Holes:'+holes);
for(i=1; i<=holes; i++) {
id = "holes_"+i;
$('#'+id).prop('checked', false);
}
chkCheckboxes();
})
正如您所看到的,我插入了警报以查看它们正在触发的命令。我的问题是ClearAll事件在显示孔复选框之前触发('在'ClearAll Event ...'之后'设置num_holes'警报显示)。
获得此异步激发的任何帮助将不胜感激。我不想使用SetTimeout(),因为时间可能因用户的计算机而异。
事件不会“异步触发”,它们按顺序触发,但其中一个事件处理程序具有异步代码,并且在触发事件时无法真正解释事件,您可能必须考虑该事件在第二个事件处理程序中,或者找到更好的方法来解决这个问题。 – adeneo