2011-07-14 20 views
0

我正在製作一個基於jQuery.ajax()的AJAX腳本,並且已經到了一個地步,我應該以某種方式檢查我嘗試加載的鏈接是否爲html頁面或像swf,圖像或zip等不同的東西。所以我需要以某種方式檢查內容類型標題並決定是否應該獲取內容(如果它是html)或拋出ajax調用並執行window.location = theUrl。我不想要的是獲得整個文件只是爲了找出它是一個100MB的zip文件。jQuery AJAX只提取標題並決定是否獲取內容

有沒有辦法'暫停'(或中止)的請求,而它仍然會去,只讀頭? HEAD調用不是一個選項,因爲這樣我就不得不每次向服務器發送2個請求。

也許某種黑客與setTimeout和低級別的xhr功能?

在此先感謝! :)

編輯:試圖從請求完成之前setTimeout中從xhr獲取標題,但它似乎並沒有填充它,直到所有的數據已被提取。

編輯2:我砍死我周圍的jQuery的東西的方式,結合自身的onreadystatechange:

var xhrr = new window.XMLHttpRequest(); 
$.ajaxSetup({ 
    xhr: function() { return xhrr } 
}); 

... 
$.ajax(....); 

var theirfunc = xhrr.onreadystatechange; 
xhrr.onreadystatechange = function() { 
    console.log('xhr state: ', xhrr.readyState); 
    theirfunc(); 
}; 

因此,這給了我州1,2,3,4,爲了和我能得到的內容類型併成功中止。我仍然在調查爲什麼當jquery自己創建XMLHttpRequest對象時它不起作用。如果我跳過ajaxSetup部分並得到var xhrr = $.ajax(...)然後以相同的方式綁定它將無法工作。那麼我的xhr與jquery的有什麼不同呢?我看到他們這樣做:

function createStandardXHR() { 
    try { 
     return new window.XMLHttpRequest(); 
    } catch(e) {} 
} 

所以它不應該有所作爲?

編輯3:找到它! jquery 1.6只返回一個虛假的xhr對象,只有少數屬性,onreadystatechange不是其中之一。

+2

爲什麼HEAD不是一種選擇?這正是它的目的,並且HEAD請求的成本應該幾乎沒有。 HTTP是一個偉大的協議,如果人們開始使用它的所有功能,網絡將是一個更好的地方。 – Daff

+0

我不想再提出任何要求。也許如果我找不到另一種方式來做到這一點... – stormbreaker

回答

4

您可能需要破解jQuery。我不知道如何做到這一點,但...

jQuery使用XMLHttpRequest()來加載數據。如果你看看這裏(記在頁面滾動)

http://en.wikipedia.org/wiki/XMLHttpRequest#The_onreadystatechange_event_listener

,你會發現它的某種方式可能附加監聽要加載的頭一個聽衆。數據將繼續加載,但使用abort()函數可以中止該數據。 如果在jQuery的源代碼看:

http://www.google.com/codesearch#LARMQtWqu54/trunk/spec/support/jquery-1.4.4.js&q=xmlhttprequest%20package:jQuery&type=cs

和搜索xhr.send(1場)和window.XMLHttpRequest(2場比賽),你會看到這些選項都用不到的jQuery本身(請注意,xhr是一個XMLHttpRequest)。但是,在window.XMLHttpRequest的第一個匹配中,它在註釋中指示您可以覆蓋此對象。然而,在第二場比賽中,評論並不存在,所以我不確定這是否會被覆蓋(因此,您可能需要破解它才能在所有瀏覽器中運行)。您需要擴展XMLHttpRequest並修改構造函數和/或發送方法以調用其父項。以評論引用的方式將該對象傳遞給jQuery。

我希望你知道聽衆是如何工作的,以及如何在javascript中進行面向對象的工作。

+0

非常感謝。看我的編輯#2 另外我正在尋找jQuery 1.6.2的來源。他們改變了一些東西 – stormbreaker

+0

我發現這個http://dev.jquery.it/ticket/9324和解決方案在完美的工作意見。但是你指出了我的方向,所以我將你的帖子標記爲答案。再次感謝 :) – stormbreaker

0

我認爲,例如,如果你指定:

contentType: "text/html; charset=utf-8" 

在您的Ajax請求,如果發送的數據不匹配您指定的請求將失敗的MIME類型,我覺得這是你如何去處理這個。

欲瞭解更多信息,請查閱this section of the jQuery documentation

而且也許你可以在beforeSend參數一展身手:

$.ajax({ 
    url: 'http://fiddle.jshell.net/favicon.png', 
    beforeSend: function(xhr) { 
    xhr.overrideMimeType('text/html; charset=x-user-defined'); 
    }, 
    success: function(data) { 
    if (console && console.log){ 
     console.log('Sample of data:', data.slice(0,100)); 
    } 
    } 
}); 

希望這有助於。

+0

這是行不通的。無論如何,服務器都會發送整個文件。我也嘗試將Accept標頭設置爲'text/html',並且服務器仍然發送文件,就像它忽略它一樣...用Apache和Nginx測試 – stormbreaker

+0

也許是beforeSend參數? – XGreen

+0

這實際上適合你嗎?服務器迴應什麼? – stormbreaker

8

通過使用'HEAD'類型,jQuery不會下載內容,它只會獲取標題。

然後,您可以通過在返回的XHR對象上使用getResponseHeader的名稱來獲取它們。

$.ajax({ 
     type: 'HEAD', 
     url: 'http://example.com/api.php', 
     complete: function(xhr) { 
      var contentLength = xhr.getResponseHeader('Content-Length'); 
     } 
}); 

您還可以得到的響應頭的列表:

xhr.getAllResponseHeaders()