Javascript 用AJAX实现动态页面获取
我有一个关于使用AJAX部分加载页面的问题 假设用户单击一个按钮,该按钮发出AJAX调用以加载页面的一部分(它可能包括动态加载的JS和/或CSS),html内容被放到某个div上。然后,在第一次加载完成之前,他单击另一个按钮,该按钮发出另一个AJAX调用,将其他内容放到同一个div上。我应该如何防止这种行为产生任何冲突?一些可能的冲突可能是这样的,例如,第一个加载对找不到的内容执行一些JS,因为第二个加载已经更改了该div 提前谢谢 编辑: 我会很感激基于异步方法的答案。谢谢。Javascript 用AJAX实现动态页面获取,javascript,html,ajax,Javascript,Html,Ajax,我有一个关于使用AJAX部分加载页面的问题 假设用户单击一个按钮,该按钮发出AJAX调用以加载页面的一部分(它可能包括动态加载的JS和/或CSS),html内容被放到某个div上。然后,在第一次加载完成之前,他单击另一个按钮,该按钮发出另一个AJAX调用,将其他内容放到同一个div上。我应该如何防止这种行为产生任何冲突?一些可能的冲突可能是这样的,例如,第一个加载对找不到的内容执行一些JS,因为第二个加载已经更改了该div 提前谢谢 编辑: 我会很感激基于异步方法的答案。谢谢。 使其同步(不推荐
- 使其同步(不推荐)
- ajaxing时禁用链接/按钮
- 别介意
但在您的情况下,它不会产生任何冲突,因为当html被替换时,脚本也一样。只需禁用导致AJAX调用在尚未完成时启动的按钮。只需禁用导致AJAX调用在尚未完成时启动的按钮。Genesis和Gaurav关于禁用用户交互的观点是正确的+我给他们每人发了一封信。如何处理逻辑实际上非常简单:
$('#my_submit_button').click(function(){
$.ajax({
url:'/my_file.php',
dataType='json',
beforeSend:function(){
$('#my_submit_button').prop('disabled',true);
},
error: function(jqXHR, status, error){
// handle status for each: "timeout", "error", "abort", and "parsererror"
// Show submit button again:
$('#my_ajax_container').html('Oops we had a hiccup: ' + status);
$('#my_submit_button').prop('disabled',false);
},
success:function(data){
$('#my_ajax_container').html(data);
$('#my_submit_button').prop('disabled',false);
}
});
});
Genesis和Gaurav关于禁用用户交互的观点是正确的+我给他们每人发了一封信。如何处理逻辑实际上非常简单:
$('#my_submit_button').click(function(){
$.ajax({
url:'/my_file.php',
dataType='json',
beforeSend:function(){
$('#my_submit_button').prop('disabled',true);
},
error: function(jqXHR, status, error){
// handle status for each: "timeout", "error", "abort", and "parsererror"
// Show submit button again:
$('#my_ajax_container').html('Oops we had a hiccup: ' + status);
$('#my_submit_button').prop('disabled',false);
},
success:function(data){
$('#my_ajax_container').html(data);
$('#my_submit_button').prop('disabled',false);
}
});
});
我不确定这是否会对您造成问题,因为Javascript是单线程的。当第一个ajax响应进入并执行一些javascript时,只要第二个ajax响应是一个连续的执行线程(在处理过程中没有计时器或其他异步ajax调用),该javascript就不能被第二个ajax响应打断 让我们运行一个场景:
您可以从这个具有重叠Ajax调用的场景和第一个处理中间的第二个完成的场景中看到,因为JavaScript引擎是单线程的,所以仍然没有冲突。 现在,正如其他答案所建议的,您可能不希望在用户仍在处理时启动新请求的用户体验,但它们在技术上不会相互冲突。如果要防止重复呼叫,可以选择以下几种工具:
- 您可以在第一次呼叫未完成时阻止启动第二次呼叫。您可以在UI和实际代码中执行此操作
- 当有多个呼叫未完成时,您可以决定放弃/忽略先前的响应,而不处理它们-只等待最后一个响应
- 当第二次呼叫启动时,您可以取消第一次呼叫
- 在上述场景中,您可以让第二个替换第一个
前两个选项要求您跟踪一些跨ajax调用状态,以便一个ajax调用可以知道是否有其他调用,并相应地采取行动。我不确定这是否会对您造成问题,因为Javascript是单线程的。当第一个ajax响应进入并执行一些javascript时,只要第二个ajax响应是一个连续的执行线程(在处理过程中没有计时器或其他异步ajax调用),该javascript就不能被第二个ajax响应打断 让我们运行一个场景:
您可以从这个具有重叠Ajax调用的场景和第一个处理中间的第二个完成的场景中看到,因为JavaScript引擎是单线程的,所以仍然没有冲突。 现在,正如其他答案所建议的,您可能不希望在用户仍在处理时启动新请求的用户体验,但它们在技术上不会相互冲突。如果要防止重复呼叫,可以选择以下几种工具:
- 您可以在第一次呼叫未完成时阻止启动第二次呼叫。您可以在UI和实际代码中执行此操作
- 当有多个呼叫未完成时,您可以决定放弃/忽略先前的响应,而不进行处理