2012-08-02 69 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之前和之后都是这样,并且存在三个相同的错误。所以最终我不确定究竟是如何造成页面速度上升的,我只知道它是值得的。

相关问题