2012-08-02 70 views
2

好的,這是一個奇怪的。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'); 
} 
}); 
+0

你傳遞給[$ .ajax](http://api.jquery.com/jQuery.ajax/)的是什麼?你指定了一個'dataType'嗎? – thisgeek 2012-08-02 02:33:42

+0

不,但請記住我在開發和生產服務器上運行完全相同的代碼。只有生產無法運行*成功*。另外,我確實嘗試指定'dataType:'html''作爲它的地獄。沒有骰子。 – mycrazydream 2012-08-02 02:38:21

+0

當一個jQuery成功回調。ajax()請求沒有被觸發,但是http請求被成功返回,通常是因爲請求指定了dataType,並且響應主體對該類型無效。但是,即使這不是這裏的原因,如果您發送傳遞給ajax調用的參數,這將有所幫助。 – thisgeek 2012-08-02 02:43:05

回答

1

好的,我終於明白了。問題是apache的mod仍然處於測試階段(至少在我的主機上)。您可以在這裏閱讀關於mod_pagespeed的所有信息:https://developers.google.com/speed/pagespeed/mod

一旦我禁用並重新啓動apache,viola,jQuery成功讀取html數據並正確觸發事件,並且現在面板正在加載。爲什麼?出於某種原因,pagespeed所做的「優化」在一分鐘內殺死了html結構,但顯然很重要。

我已經通過w3c驗證程序運行了片段,在pagespeed之前和之後都是這樣,並且存在三個相同的錯誤。所以最終我不確定究竟是如何造成頁面速度上升的,我只知道它是值得的。

相關問題