AJAX解雇no_connection();太早了

时间:2012-12-31 10:12:07

标签: ajax google-chrome google-chrome-extension

我有这个Google Chrome扩展程序..

的manifest.json:

{
  "name": "My extension",
  "manifest_version": 2,
  "version": "1.0",
  "permissions": [
    "tabs", "http://*/*"
  ],
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "content_scripts": [
    {
      "matches": ["http://*/*", "https://*/*"],
      "js": ["jquery-1.8.3.min.js", "content.js"],
      "run_at": "document_end"
    }
  ]
}

popup.html:

<!doctype html>
<html>
  <head>
    <title>Getting Started Extension's Popup</title>
    <style>
      body {
        min-width:357px;
        overflow-x:hidden;
      }

      img {
        margin:5px;
        border:2px solid black;
        vertical-align:middle;
        width:75px;
        height:75px;
      }
    </style>

    <!-- JavaScript and HTML must be in separate files for security. -->
    <script src="popup.js"></script>
  </head>
  <body>
    <div id="ajax">
    </div>
  </body>
</html>

popup.js:

function start() {
    var reg = false;
    if (window.ActiveXObject){
        reg = new ActiveXObject("Microsoft.XMLHTTP");
    }else {
        reg = new XMLHttpRequest();
    }
    reg.open("GET","http://www.dr.dk/",true); // Insert a reference of the php page you wanna get instead of yourpage.php
    reg.send(null);
    reg.onreadystatechange = function () {
        if (reg.readyState == 4 && reg.status == 200) {
            document.getElementById('ajax').innerHTML = reg.responseText;
        }else {
            no_connection();
        }
    }
}

function no_connection() {

    var reg = false;
    if (window.ActiveXObject){
        reg = new ActiveXObject("Microsoft.XMLHTTP");
    }else {
        reg = new XMLHttpRequest();
    }
    reg.open("GET","no_connection.html",true); // Insert a reference of the php page you wanna get instead of yourpage.php
    reg.send(null);
    reg.onreadystatechange = function () {
        if (reg.readyState == 4 && reg.status == 200) {
            document.getElementById('ajax').innerHTML = reg.responseText;
        }else {
            document.getElementById('ajax').innerHTML = 'An Unknown Error did happened.';
        }
    }
}

start();

这总是提供来自no_connection.html的内容,但如果我对该行发表评论:

no_connection();

来自:

function start();

然后它工作正常,然后显示http://www.dr.dk/

的内容

no_conncection();if else语句中时,如何发生这种情况,那么它怎么会覆盖呢?

任何想法如何解决这个问题,因为这变得非常奇怪。

1 个答案:

答案 0 :(得分:1)

reg.onreadystatechange 是一个块函数,每次状态更改时都会调用它。因此在呼叫期间以及呼叫之后被呼叫。 (两次,可能更多)

另外,请注意,当有人从他们的网站上搜索内容时,dr.dk会非常愤怒,甚至只是从其他网站链接到他们...

在你的else语句中,你需要特别注意失败。建议结构:

request[requestid].onreadystatechange = function() {
  /* This is a slightly confusing part of the script.  We don't wait to hear back from the server before we continue
  with the communicate() function.  It sends the request, and if and when the server gets back to us, whatever's
  specified as request[requestid].onreadystatechange is performed.  So, we have to define .onreadystatechange
  BEFORE we actually make contact with the server.  If you're reading this and trying to learn how it works,
  you may want to take a glance at the last part of the communicate() function first, and then come back here. */
  try {
   /* We use try and catch because Javascript will give an error when we try to access request[requestid].status if the
   server is down or if the user navigates away from the page. */
   if (request[requestid].readyState == 4 && request[requestid].status == 200) {
    window.clearTimeout(timeout[requestid]);
    document.body.style.cursor = 'default';
    /* 4 = The AJAX Request is complete; 200 = The HTTP server found the data we needed and was able to send it to us. */
    eval(request[requestid].responseText);
    } else if (request[requestid].readyState == 4 && request[requestid].status != 200) {
    window.clearTimeout(timeout[requestid]);
    if (failure) eval(failure);
    document.body.style.cursor = 'default';
    alert ('Error ' + request[requestid].status + ':  Server error.  If you entered data, it may or may not have been saved.  Please contact your systems administrator.');
    }
   } catch(e) {
   window.clearTimeout(timeout[requestid]);
   document.body.style.cursor = 'default';
   if (failure) eval(failure);
   alert ('Error:  Unable to communicate with server.  Please contact your systems administrator.  You may want to try again in a few minutes to see if the problem fixes itself. \n\n(Either the server was down, the communication was interrupted, or there was an error in the data sent by the server.)\n' + e + '\n\n' + request[requestid].responseText);
   }
  }