【问题标题】:How to handle XHR error display messages?如何处理 XHR 错误显示消息?
【发布时间】:2016-02-10 18:09:05
【问题描述】:

我正在尝试使用 XHR 从另一个来源获取一些内容,如下所示:

function fetchPage(str)
{
    if(str=="")
    {
        document.getElementById("table").innerHTML="";
        resetFilters();
        $('#progress').hide();  //fetching progress bar <div>
        return;
    }
    if (window.XMLHttpRequest) // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    else // code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange=postCallback;
    xmlhttp.open("GET", "fetch.php?url=http://www.sis.itu.edu.tr/tr/ders_programlari/LSprogramlar/prg.php?fb="+str, true);
    xmlhttp.send();

// any stuff that goes here will happen before callback
//  (this is a good place to update a UI element showing a call is resolving.)
//  (for example a spinner or text saying "fetching")
$('#progress').show();
progressFetching();
switch(xmlhttp.readyState){ //loading bar adjustments
    case 0:
        $('.bar').css("width","0%");
        $('.bar').text("0%");
        break;
    case 1:
        $('.bar').css("width","25%");
        $('.bar').text("25%");
        break;
    case 2:
        $('.bar').css("width","50%");
        $('.bar').text("50%");
        break;
    case 3:
        $('.bar').css("width","75%");
        $('.bar').text("75%");
        break;
}
}



function postCallback()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200){
    progressDone();   //loading is finished
    $('#error').hide();
    document.getElementById("table").innerHTML=xmlhttp.responseText;                     

    // continue to process post callback.
    resetFilters();
}
else {
    // report error with fetch

    /*if(xmlhttp.status==404 || xmlhttp.responseText == "")
        $('#error').show();*/
    //$('#error').show();
}
}

我希望我的页面在发生连接超时时显示错误,或者当计算机没有互联网连接(可能是在闲逛时发生断开连接)或网页无法获取其他网页内容的任何其他情况来源。

使用上面的代码,在else 块中,如果我在/* */ 注释部分选择if(xmlhttp.status==404 || xmlhttp.responseText == ""),我不会收到错误,除非它不是404 错误。如果我去// 评论部分,在提取过程开始直到完成后会显示错误,即在xmlhttp.readyState = 0xmlhttp.readyState = 4 之间。如何使用这些属性或其他内容显示连接错误消息?

感谢您的关注:)

【问题讨论】:

  • 既然你已经有了 jQuery,为什么不使用 jQuery 来处理 XHR?它更容易,并且可能修复了一些您(还)没有想到的跨浏览器问题。
  • 我认为您正在使用 jQuery,如果是这种情况,请查看:api.jquery.com/jQuery.ajax 并查看“错误”参数(不要重新编程您已有的)
  • 我是新手,谢谢你的建议:)

标签: javascript jquery xmlhttprequest


【解决方案1】:

根据这个stackoverflow:XMLHttpRequest (Ajax) Error

 xmlhttp.onreadystatechange = function (oEvent) {
   if (xmlhttp.readyState === 4) {
     if (xmlhttp.status === 200) {
       console.log(xmlhttp.responseText)
     } else {
       console.log("Error", xmlhttp.statusText)
     }
   }
 }

【讨论】:

  • 这无济于事,因为这个例子是内联的,而他的例子是外部的,这就是问题所在。
【解决方案2】:

问题是我在上一个问题中的模板有缺陷。我相信这会更好,因为它创建了一个闭包来传递您需要使用的变量。

再一次,我没有对此进行测试,因此它可能存在拼写错误和错误——除了如何调用 postCallback() 并向其添加参数之外,我也没有进行任何更改。

function fetchPage(str)
{
    if(str=="")
    {
        document.getElementById("table").innerHTML="";
        resetFilters();
        $('#progress').hide();  //fetching progress bar <div>
        return;
    }
    var xmlhttp;

    if (window.XMLHttpRequest) // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    else // code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange=function () { postCallback(xmlhttp); };
    xmlhttp.open("GET", "fetch.php?url=http://www.sis.itu.edu.tr/tr/ders_programlari/LSprogramlar/prg.php?fb="+str, true);
    xmlhttp.send();

// any stuff that goes here will happen before callback
//  (this is a good place to update a UI element showing a call is resolving.)
//  (for example a spinner or text saying "fetching")
$('#progress').show();
progressFetching();
switch(xmlhttp.readyState){ //loading bar adjustments
    case 0:
        $('.bar').css("width","0%");
        $('.bar').text("0%");
        break;
    case 1:
        $('.bar').css("width","25%");
        $('.bar').text("25%");
        break;
    case 2:
        $('.bar').css("width","50%");
        $('.bar').text("50%");
        break;
    case 3:
        $('.bar').css("width","75%");
        $('.bar').text("75%");
        break;
}
}



function postCallback(xmlhttp)
{
if (xmlhttp.readyState==4 && xmlhttp.status==200){
    progressDone();   //loading is finished
    $('#error').hide();
    document.getElementById("table").innerHTML=xmlhttp.responseText;                     

    // continue to process post callback.
    resetFilters();
}
else {
    // report error with fetch

    /*if(xmlhttp.status==404 || xmlhttp.responseText == "")
        $('#error').show();*/
    //$('#error').show();
}
}

【讨论】:

  • 谢谢@Hogan,我稍微修改了一下就解决了。我已经看到了问题并按照您的建议更改了功能。这是生成的代码if (xmlhttp.readyState==4){ if(xmlhttp.status==200 &amp;&amp; xmlhttp.responseText != ""){else { $('#progress').hide(); $('#error').show(); } 一切似乎都按我的意愿工作。它是好的编程吗?谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 2010-09-27
相关资源
最近更新 更多