Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 在Ajax请求中间更改页面_Jquery_Ajax - Fatal编程技术网

Jquery 在Ajax请求中间更改页面

Jquery 在Ajax请求中间更改页面,jquery,ajax,Jquery,Ajax,如果我发送一些ajax请求,并在请求返回之前立即更改页面(比如说跟随某个链接),会发生什么?我的意思是,我假设XHR对象向网站发送了一个请求,但是在检索响应之前,它被删除了(因为页面已更改),那么响应应该发送到哪里呢 我问这个问题是因为我的网站有一个奇怪的问题。我有一个页面,通过Ajax请求从数据存储加载帖子。如果在加载完成之前我点击了一个链接,我会得到jQuery.ajax的onerror!不知道为什么会这样 编辑:这是我对ajax的调用。在正常情况下,调用success回调。但是当我点击一个

如果我发送一些ajax请求,并在请求返回之前立即更改页面(比如说跟随某个链接),会发生什么?我的意思是,我假设XHR对象向网站发送了一个请求,但是在检索响应之前,它被删除了(因为页面已更改),那么响应应该发送到哪里呢

我问这个问题是因为我的网站有一个奇怪的问题。我有一个页面,通过Ajax请求从数据存储加载帖子。如果在加载完成之前我点击了一个链接,我会得到jQuery.ajax的onerror!不知道为什么会这样

编辑:这是我对ajax的调用。在正常情况下,调用success回调。但是当我点击一个链接时,就会调用错误回调!我正在考虑一些事情,可能是因为数据应该被格式化为JSON,但是请求在中间被切断,所以数据被认为是无效的,导致jQuery调用错误回调?!但是为什么这些请求会在中间被剪掉?

$.ajax({
  type: (args.rel == "async" || args.rel == "dialog") ? "GET" : "POST",
  url: href,
  dataType: "json",
  data: args.data ? args.data:{}, // send {} to ensure Content-Length header
  success: function(data){
    if (context) context.removeClass("ajax_wait");
    if (args.hideonwait) $(args.hideonwait).show();
    if (args.showonwait) $(args.showonwait).hide();
    if (spinner) remove_spinner(context, spinner);
    handle_response(args, context, target, data);
  },
  error: function(xhr, status, errorThrown){
    if (context) context.removeClass("ajax_wait");
    if (args.hideonwait) $(args.hideonwait).show();
    if (args.showonwait) $(args.showonwait).hide();
    if (spinner) remove_spinner(context, spinner);
    ajax_error(args, context,
               status + "-" + xhr.status,
               errorThrown ? errorThrown : xhr.responseText);
  }
});

你会倒霉的。你就没有回电话了。Ajax响应将丢失。在这种情况下,我会在页面上放置一个拦截器。这是很常见的,为了防止再次点击。拦截器只不过是“覆盖”整个浏览器的大遮罩。它还可以有一个等待图标

这种行为似乎是当用户离开页面时,任何未完成的ajax请求都会以0作为状态完成。jQuery将其解释为错误,这就是它调用错误处理程序的原因。在错误处理程序中,如果xhr.status==0,您可以调用成功处理程序调用的相同函数,否则执行所需的错误行为。

此问题的解决方案很简单,您需要做的只是如果请求当前正在运行,并且用户单击任何其他链接,然后您需要提醒用户请求正在处理中,请稍候

要实现这一点,您需要维护一个信号量,在触发任何请求之前设置该信号量,并在该请求完成时重置该信号量。单击每个链接(更改页面)时,调用一个方法来检查信号量,如果设置了信号量,则该方法会向用户发出上述警报。这样,在请求完成之前,用户将无法更改页面,请求被中止的问题将得到解决


希望这能回答问题。

诀窍是检查XMLHttpRequest对象中的响应头。如果没有响应头(null或空字符串,具体取决于浏览器),则服务器尚未响应。这意味着用户已中止

$.ajax({
    url: "url-to-go-here",
    success: function() {
    },
    error: function(xhr, textStatus, errorThrown) {
        if(!isUserAborted(xhr)) {
            console.log("Ajax Error")
        }
    }
});

function isUserAborted(xhr) {
  return !xhr.getAllResponseHeaders();
}

几天前我不得不处理同样的问题。。似乎处理起来没那么复杂。。我们应该能够分辨出这是某种ajax错误还是用户中止请求。。当然,我们不会从xhr对象获取特定事件。。这就是为什么ajax错误会出现异常……结合xhr对象和异常值,我们可以解决这个问题

var message = '';
$('whatever').ajaxError(function(e, xhr, settings, exception) {
  // logic
   if (!xhr.status){
      if (exception=='abort'){
         message = 'User aborted AJAX request !'; 
      }
   }
}

这是一个合理的答案,但我是不是接到了报案人的电话?!如果我不更改页面,请求就可以正常工作,因此没有理由调用OneError。是的。。。。我现在在想这个。。。这是一个奇怪的问题。我想知道回复是否会回来寻找回调。。但仍有人会认为它会“死”。这很有趣--你能用一个非常简单的页面复制它吗?“我很好奇,”普罗米特说,“我对这个问题投了赞成票——这很有趣。”。稍后将再次查看。仅检查
!xhr.getAllResponseHeaders()
可能无法在所有浏览器中工作。即使响应中没有标题,它也可以返回空对象,因此您还必须检查空对象。否则,这就像一个符咒,应该被接受为正确答案。我在互联网上的其他地方看到了一个答案,可以检查
xhr.State()==“拒绝”
。一种方法比另一种更有效吗?