1

私はこのGoogleChrome拡張機能を持っています。

マニフェスト.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はブロック関数であり、状態が変化するたびに呼び出されます。したがって、通話中だけでなく、通話後にも呼び出されます。(2回、場合によってはそれ以上)

また、補足として、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);
   }
  }
于 2012-12-31T10:16:20.157 に答える