好的,這是一個奇怪的。jQuery成功處理程序沒有在生產服務器上執行,但在開發中工作正常
快速概要:我正在使用SilverStripe CMS,它通過一組ajax延遲加載面板將UI加載到其管理員中。這一切在開發中都很棒。而Ajax調用來獲取主面板的數據同時適用於兩者。也就是說,它會在開發和生產服務器上返回數據(在這種情況下爲html),並帶有200個代碼(所以Firebug說)。
現在,在處理程序中有一個成功,錯誤和完整的功能 - 成功需要數據並創建主要內容面板。在我的本地開發服務器上,成功和完全的解決方案都很好。但是在製作過程中,只有完全的火焰,儘管我可以用Firebug看到數據返回的很好(如我所說,有200個)。爲什麼不成功運行?當然,我可以移動成功邏輯到完成,但此服務器可能會繼續產生問題。
下面是在開發AJAX調用的響應頭:
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection Keep-Alive
Content-Length 38407
Content-Type text/html; charset=utf-8
Date Thu, 02 Aug 2012 01:02:08 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive timeout=5, max=100
Pragma no-cache
Server Apache/2.2.22 (Unix) mod_ssl/2.2.22 OpenSSL/1.0.1c DAV/2 PHP/5.3.12
Set-Cookie PastMember=1; expires=Wed, 31-Oct-2012 01:02:09 GMT; path=/; httponly
X-Controller CMSPagesController
X-Include-CSS /framework/admin/thirdparty/jquery-notice/jquery.notice.css?m=1340880397...
X-Include-JS /framework/thirdparty/jquery/jquery.js?m=1340880400...
X-Powered-By PHP/5.3.12
X-Title SilverStripe - Pages
以下是在生產的頭文件(明顯不同的是編碼/壓縮):
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0
Connection Keep-Alive
Content-Encoding gzip
Content-Length 2796
Content-Type text/html; charset=utf-8
Date Thu, 02 Aug 2012 01:44:20 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive timeout=2, max=98
Pragma no-cache
Server Apache
Set-Cookie PastMember=1; expires=Wed, 31-Oct-2012 01:44:22 GMT; path=/; httponly
Vary Accept-Encoding
X-Controller CMSPagesController
X-Include-CSS /framework/admin/thirdparty/jquery-notice/jquery.notice.css?m=1342411329...
X-Include-JS /framework/thirdparty/jquery/jquery.js?m=1342412461...
X-Mod-Pagespeed 0.10.21.2-1381
X-Title SilverStripe - Pages
爲了使事情真的很奇怪,我可以通過打破文件來「解決」情況。如果我在DOCTYPE:.<!DOCTYPE html>
之前添加字符,則會運行成功處理程序並加載面板。刪除一個字符,面板不再加載。我很爲難: -/
==== ====編輯
這裏是ajax的處理程序,非常香草,沒有什麼特別的事情。我添加了調試控制檯。錯誤永遠不會運行,只需成功和完成在dev服務器上,只有完成上生產。現在我的猜測是它試圖驗證基於doctype(html5)的html,並且它出現錯誤?我認爲jQuery沒有那麼深入。另外,我將關閉壓縮和生產中的pagespeed模塊,看看它是否有效,因爲dev沒有這些功能。
$.ajax({
url: url,
complete: function() {
self.removeClass('loading');
if(window.console) console.log('complete');
},
success: function(data, status, xhr) {
if(window.console) console.log('success');
self.html(data);
},
error: function(){
if(window.console) console.log('error');
}
});
你傳遞給[$ .ajax](http://api.jquery.com/jQuery.ajax/)的是什麼?你指定了一個'dataType'嗎? – thisgeek 2012-08-02 02:33:42
不,但請記住我在開發和生產服務器上運行完全相同的代碼。只有生產無法運行*成功*。另外,我確實嘗試指定'dataType:'html''作爲它的地獄。沒有骰子。 – mycrazydream 2012-08-02 02:38:21
當一個jQuery成功回調。ajax()請求沒有被觸發,但是http請求被成功返回,通常是因爲請求指定了dataType,並且響應主體對該類型無效。但是,即使這不是這裏的原因,如果您發送傳遞給ajax調用的參數,這將有所幫助。 – thisgeek 2012-08-02 02:43:05