2010-09-27 38 views
1

問題在於瀏覽器如何實現簡單調用的區別。使用colorbox擴展(facebox變體)時發生此問題。內容使用jquery load()函數加載到colorbox中。由jQuery .load函數進行的Ajax調用

當呼叫由Chrome瀏覽器製作,接受頭被設置爲:

Accept: text/html, */*, text/javascript 

在Firefox中的情況下,頭看起來是這樣的:

Accept: text/javascript 

我試圖強行通過Accept頭設置它使用:

jQuery.ajaxSetup({ 
    'beforeSend': function (xhr) {xhr.setRequestHeader("Accept", "text/javascript")} 
}); 

它使用$ .ajax調用時效果很好,但它似乎沒有影響.load函數。任何 想法如何解決這個問題?

+2

你在哪裏使用'.load()'獲取javascript?這是爲了獲得內容,所以你可能會更好地使用不同的方法。 – 2010-09-27 20:22:14

+0

$ .ajax更好的方法 – 2010-09-27 20:44:11

+0

Actualy它的colorbox正在加載,我寧可不改變它的代碼,除非沒有其他方式做它。這是未壓縮的jquery-colorbox.js第650行的片段http://gist.github.com/599891 – mdrozdziel 2010-09-27 21:30:05

回答

0

儘管通過直接使用$.ajax來避免此問題顯然更好,但您可以爲$.ajax方法創建代理方法。這有助於$.load調用$.ajax以及一組默認參數。因此,我們可以攔截$.load的電話$.ajax

var org = $.ajax; 
$.ajax = function(settings){ 
    settings['accepts'] = null; 
    settings['beforeSend'] = function(xhr) { 
     xhr.setRequestHeader("Accept", "text/javascript"); 
    } 
    org(settings); 
} 

$("#foo").load("http://fiddle.jshell.net/FpCBJ/show/light/"); 

Try

顯然,這將影響所有的呼叫,$.ajax,所以你可能要到另一個參數添加到可調用時設置,並在代理檢查,以避免設置requestheader代理方法直。甚至在設置。

我想你也可以爲每個調用添加/刪除代理,但是這會增加開銷並可能導致競爭條件(?)(如果您在請求後直接刪除代理,則不會這麼想)等待回調),所以你需要某種鎖。

編輯:增加settings['accepts'] = null;以保持$.ajax在回調之前添加任何標題,因爲setRequestHeader()只添加,不能替換。男孩這是骯髒的。

編輯2:其實,一個也許更清潔的選擇是建立自己的接受,並指他們允許$.ajax做的工作全部由自己的數據類型,並設定XHR地圖:

var org = $.ajax; 
$.ajax = function(settings){ 
    settings['accepts'] = {"myDataType" : "text/javascript"}; 
    settings['dataType'] = "myDataType"; 
    org(settings); 
} 

$("#foo").load("http://fiddle.jshell.net/FpCBJ/show/light/");