2012-05-14 53 views
1

我在使用在Greasemonkey腳本上調用getResponseHeader時獲得的值時出現問題。無法使用通過調用getResponseHeader獲得的值

首先,我聲明如下全局變量:

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

一旦網站已經完全加載,我的主要函數被調用,並在它的內部,我得到了一定專區內的所有圖像(其這裏沒有顯示,因爲它是不相關):

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 

我試圖通過檢查,我在這個網站上發現了一些其他問題找出答案,我猜有事情做與同步,但我真的不知道如何解決這個問題。

回答

2

圖像都在同一臺服務器上,對吧? XMLHttpRequest()不會做跨域請求(沒有一些不適用於Greasemonkey上下文的新環節)。

有與該代碼的幾個問題:

  1. 該公司預計大小來設定同步調用,但異步XMLHttpRequest()
  2. 它中止請求!太快了。沒有理由放棄HEAD請求。
  3. 它以模糊的方式使用「幻數」。可用時使用正確的枚舉常量。 EG this.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(最後一次檢查 - 幾個月前)無法正常工作。
+0

非常感謝!您的回答對我非常有幫助和啓發性,並且問題已解決。 對不起,但我不能投你的答案,因爲我沒有足夠的聲譽。 –

+0

很高興你解決了你的問題!此外,您可能還無法投票,但您可以[勾選此答案旁邊的複選標記](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-工作/ 5235#5235)如果它幫助你。 –