好的,这是一个奇怪的。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