1

getResponseHeaderGreasemonkeyスクリプトを呼び出したときに取得した値を使用するのに問題があります。

まず、次のグローバル変数を宣言しました。

size = 0;
maxS = 153600; // Max. size (bytes).

Webサイトが完全に読み込まれると、メイン関数が呼び出され、その内部で特定のdiv内のすべての画像が取得されます(関連性がないため、ここには表示されていません)。

function main() {
    ...
    var imgs = posts[i].getElementsByTagName('img');
    for (var j = 0; j < imgs.length; ++j) {
        getFileSize(imgs[j].src, responseHandler);
        if (size > maxS)
            // Do something
    }
    ...
}

そして、これがどのように機能するかgetFileSizeです:

var getFileSize = function(address, responseHandler) {
    var req = new XMLHttpRequest();
    req.open('head', address, true);
    req.onreadystatechange = responseHandler;
    req.send(null);
};

var responseHandler = function(resp) {
    if (this.readyState == 1)
    this.abort();
    size = this.getResponseHeader("Content-length");
};

問題は、文の後にサイズの値をチェックしても

size = this.getResponseHeader("Content-length");

値は私が期待する値です。メイン関数では、コードのこの部分に到達したときの値はまだ0です。

if (size > maxS)
    // Do something

私はこのウェブサイトで見つけた他のいくつかの質問をチェックして答えを見つけようとしました、そしてそれは同期と関係があると思いますが、私はこの問題を修正する方法を本当に知りません

4

1 に答える 1

2

画像はすべてまったく同じサーバー上にありますよね? XMLHttpRequest()クロスドメインリクエストを実行しません(とにかく、Greasemonkeyコンテキストに適用されないいくつかの新しいフープなしで)。

そのコードにはいくつかの問題があります。

  1. サイズは同期的に設定されることを想定していますが、XMLHttpRequest()非同期的に呼び出します。
  2. リクエストを中止します!そして早すぎる。HEADリクエストを中止する正当な理由はありません。
  3. それはあいまいな方法で「マジックナンバー」を使用します。可能な場合は、適切な列挙定数を使用してください。EGthis.readyState == 1が悪いです。 this.readyState == this.OPENED優れている。

同期動作の場合は、を変更してくださいgetFileSize()。そのように呼んでください:

getFileSize (imgs[j].src);

次のように定義します。

function getFileSize (address) {
    var request = new XMLHttpRequest();  
    request.open ('HEAD', address, false);  //-- false = Synchronous
    request.send (null);  

    size        = -666; // Error, or AJAX fail.
    if (request.status === 200) {  
        size    = request.getResponseHeader ("Content-length");
    }  
}



ノート:

  1. パフォーマンスと使いやすさの理由から、非同期AJAXを使用するようにアプローチをリファクタリングすることをお勧めします。しかし、それは別の質問であり、直感的ではありません。
  2. 画像がクロスドメインの場合は、使用する必要があります。GM_xmlhttpRequest()これは、動作が少し異なり、同期AJAXでは正しく機能しません(最後に確認したのは、数か月前のことです)。
于 2012-05-14T10:07:25.107 に答える