我很努力地尝试调试仅使用Safari(运行5.1)时遇到的问题。
我正在使用jQuery做一个简单的ajax GET请求,如下所示:
$.ajax({
type: "GET",
url: "get_values.cgi",
data: {},
contentType: "application/json; charset=utf-8",
headers: { "cache-control": "no-cache","pragma":"no-cache" },
dataType: "JSON",
cache: false,
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Fatal Error");
},
success: function (data) {
(do stuff here)
}
此调用在除Safari之外的所有浏览器中均能正常工作。 CGI代码返回格式正确的JSON数据,并且所有其他浏览器都对其进行了愉快的解析(已通过IE,Chrome和Firefox的最新版本进行了测试)。
Safari引发的错误来自jQuery代码-它是“ JSON:意外的EOF”。
从使用Safari调试器逐步浏览jQuery代码很明显,Safari完全丢弃了返回的JSON数据-试图解析空字符串并因此引发错误。
我们已经观察了HTTP与消息监视软件之间的来回请求,发现CGI显然正在正确地创建消息并将其正确发送到Safari。是Safari丢弃了JSON数据。
[我在这里看到了其他问题,这些问题讨论的是Safari的身份验证堆栈存在问题而导致的Safari空响应,但是如上所述,在标头中添加了无缓存规则并没有什么区别;更改为POST类型也没有区别。
[帮助,我正在拔头发!
可能站点正在以http://domain.com运行(没有www),而ajax调用正在以http://www.domain.com运行。 Safari会将其视为跨域请求...尝试确认该版本。作为解决方案,可以使用例如。htaccess ...
强制www。我今天遇到了这个确切的问题。 JSON已从/php/chat.php
中正确返回,当直接加载时可以正常工作。但是当由Ajax加载时,它抛出“发生意外错误”。如上所述,探索JSON解析发现了“ JSON:意外的EOF”-我被迫得出结论,Safari会欺骗内容。
尝试一下我唯一可以应用的解决方案是将/php/chat.php
重命名为/php/chat/index.php
,然后由Ajax使用/php/chat/
加载它。
浏览PHP,逐步记录未显示任何服务器错误,并且正确生成了JSON和发送。