1

我有这个谷歌浏览器扩展..

清单.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语句中时,它怎么能覆盖它呢?

知道如何解决这个问题,因为这变得很奇怪。

4

1 回答 1

1

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

另外,一个旁注,请记住,当有人从他们的网站上窃取内容,甚至只是从其他网站上链接到他们时,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);
   }
  }
于 2012-12-31T10:16:20.157 回答