jQuery成功处理程序没有在生产服务器上执行,但在dev中工作正常

时间:2012-08-02 02:10:05

标签: javascript ajax callback http-headers doctype

好的,这很奇怪。

快速摘要:我正在使用SilverStripe CMS,它通过一组ajax延迟加载面板在其管理员中加载UI。它在开发中都很棒。并且用于获取主面板数据的ajax调用在两者中都有效。也就是说,它在dev和生产服务器上返回数据(在本例中为html),带有200个代码(因此Firebug说)。

现在,在处理程序中有成功,错误和完整功能 - 成功获取数据并创建主内容面板。在我的本地开发服务器上,成功和完全开火都很好。但是在生产中,只有完全火灾,即使我可以看到Firebug数据返回得很好(就像我说的那样200)。为什么没有成功运行?当然,我可以将成功逻辑移动到完成,但是这台服务器可能会继续产生问题。

以下是Dev 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处理程序,非常香草,没什么特别的。我添加了控制台进行调试。错误永远不会在开发服务器上运行,只是成功完成,生产时只有完成。现在我的猜测是它试图根据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');
}
});

1 个答案:

答案 0 :(得分:1)

好的,我终于明白了。问题是仍然处于测试阶段的apache模式(至少与我的主机有关)。你可以在这里阅读关于mod_pagespeed的所有内容:https://developers.google.com/speed/pagespeed/mod

一旦我禁用了它并重新启动了apache,中提琴,jQuery成功读取了html数据并正确触发了事件,现在面板正在加载它们应该。为什么?出于某种原因,&#34;优化&#34;这个pagespeed在某种程度上杀了html结构,但显然很重要。

我在页面速度之前和之后通过w3c验证器运行了片段,并且存在相同的三个错误。所以最后我还不确定页面速度是如何搞砸的,我只知道它是值得的。