Javascript 如何确保函数中的jQuery代码在其他函数之前执行
我在对我的服务器执行AJAX调用的函数中遇到了非常奇怪的行为 下面的代码来自我的jQuery脚本。下面显示的两个函数在我的脚本中按此顺序显示。如果您遵循这些警报,它们将记录整个脚本的处理顺序 对于我的脚本过程来说,奇怪的、无法解释的、坦率地说是有问题的是,Javascript 如何确保函数中的jQuery代码在其他函数之前执行,javascript,jquery,ajax,onchange,Javascript,Jquery,Ajax,Onchange,我在对我的服务器执行AJAX调用的函数中遇到了非常奇怪的行为 下面的代码来自我的jQuery脚本。下面显示的两个函数在我的脚本中按此顺序显示。如果您遵循这些警报,它们将记录整个脚本的处理顺序 对于我的脚本过程来说,奇怪的、无法解释的、坦率地说是有问题的是,$.ajax()调用在我需要时没有执行。它最后被执行 我的脚本编码有问题吗 $(document).ready(function() { $(window).load(function() { $('#agentID').chan
$.ajax()
调用在我需要时没有执行。它最后被执行
我的脚本编码有问题吗
$(document).ready(function() {
$(window).load(function() {
$('#agentID').change(function() {
alert('This alert displays on screen First');
$.ajax({
url: '/scripts/ajaxAgent.php',
type: 'GET',
dataType: 'html',
data: 'lookup=' + $('#agentID').val(),
success: function(data) {
if (data == 1) {
alert('Oddly and incorrectly, this alert displays on screen Third');
$('.visibility').show();
$('#resTypeID').closest('div').removeClass("optional");
$('#resTypeID').closest('div').addClass("required");
}
else {
alert('Oddly and incorrectly, this alert displays on screen Third');
$('.visibility').hide();
$('#resTypeID').closest('div').removeClass("required");
$('#resTypeID').closest('div').addClass("optional");
}
resTypeVisibilityHandler = data; // this var is set to global at top of this script
}, // end success
error: function() {
alert('An error occurred in processing.');
} // end error
}); // end .ajax()
}); // end agentID .change()
$('#agentID').focus();
$(document).on('change', '.visibilityControl', function(event) {
alert('This alert displays on screen Second');
// ...
}); // end .on('change') visibility control
}); // end .load()
}); // end .ready()
@pep回答了我唯一的问题。出于某种原因,阻止新答案或错误答案也是如此。以下是解决方案:
“因此,您可以简单地将脚本完成时需要执行的所有代码包装成一个函数。然后,在AJAX成功结束时,您可以调用该函数,此时时间将是正确的,因为代码将按预期在示例中执行第三个。”
他明白了…这就是我们要做的
2014-12-12@13:15(GMT-5)请求SO上议院重新提出这个问题,以便我能正确地接受正确答案。Ajax使用异步方式获取数据。现在,这意味着一旦启动数据请求,页面将继续运行其余的javascript(如果可用),并在收到数据后运行ajax的承诺。因此,这完全取决于从ajax URL返回数据所需的时间。在任何情况下,ajax都会在浏览器中的脚本几乎同时运行的情况下持续运行,但从服务器获取数据需要更多的时间。这是预期的行为。Javascript是单线程的。像Ajax这样的函数需要一些时间来执行,因为请求和响应之间存在延迟。如果javascripts等待结果,那么它会阻塞单个线程,任何javascript代码都无法运行,直到响应出现
为了消除这种情况,javascripts使用异步非阻塞事件机制。Ajax是一个异步函数。由于AJAX调用需要时间来获得结果,因此您正在传递一个函数,以便在响应到来后执行。Javascript不会等到请求到来,js会继续执行Ajax函数下面的代码,直到响应到来。。当响应到来时,js执行您发送(回调)给Ajax函数的函数。这就是第三个警报延迟的原因。AJAX中的A代表异步,这意味着您的ajaxhttp请求被触发,但只有在将来服务器响应时才会调用
success
函数。这就是你看到它的原因。啊,明白了。谢谢@pep。在ajax完成之前,是否还有停止脚本处理的方法?@H.Ferrence您可以使用async:false,
,但不应该!请注意:您不想这样做,因为每当脚本被“暂停”或“等待”时,您的浏览器都会被冻结,因为呈现UI的线程与执行脚本的线程共享。因此,您可以简单地将脚本完成时需要执行的所有代码包装到函数中。然后,在AJAX成功结束时,您可以调用该函数,此时时间将是正确的,因为代码将按预期在示例中执行第三个。忽略使用async:false
的建议,除非您愿意在整个AJAX请求期间完全牺牲页面响应能力。如果您的AJAX调用由于某种原因需要3秒钟才能响应,那么在这种情况下,您的浏览器将显示为冻结状态。