【发布时间】:2014-08-16 05:59:35
【问题描述】:
让 ajax 调用和响应在 IE8(是的,不幸的是,这是我的工作组所使用的版本)、Firefox 和 Chrome 中正常工作,我非常难过。
我将 ajax 请求发送到后端的单个 PHP 脚本。因为我过去遇到过奇怪的问题,IE 会突然抱怨/表现得好像我们的一些内部/内联网服务器实际上是“跨域”的,所以我确保 PHP 脚本将数据对象包装到回调函数中:
echo $callback_name.'('.$jsondata.');';
(但是,来自前端的所有 ajax 请求都传递相同的回调名称,只是为了保持简单:jsonpCallback。)
我的前端请求都遵循相同的格式:
$.ajax({
type: 'GET',
url: 'ajax_fetcher.php',
data: { action: 'fetchexecmsg', incident_id: incident_id_number},
dataType: 'jsonp', // doing this because it should avoid cross-domain issues
jsonp:'callback_name',
jsonpCallback: 'jsonpCallback',
success: function(data){
console.log("Ajax call to fetchexecmsg was successful.");
Parse_JSON_object_into_Exec_Msg_Div(data);
}
});
我大部分时间都在使用 Chrome 进行构建/测试。所以,今天,我决定测试 Firefox 和 IE8。
令我惊讶的是,Firefox 抱怨 'jsonpCallback' 不是一个实际的函数??
TypeError: jsonpCallback is not a function (red text in the console)
我的理解是,如果我已经预定义了一个“成功”函数,那么这个函数就不需要实际存在了吗?
所以,我将它作为一个空函数全局放入...现在 Firefox 抱怨:
Error: jsonpCallback was not called
这之后是一个ajax parseerror,其中jqXHR.responseText = undefined。 我现在看到 Chrome 也在记录 parseerror -> undefined 。
任何人都可以提供任何指导吗?我想我现在的重点应该放在这个“jsonpCallback”上。我认为我需要从后端返回,以便“愚弄”浏览器认为它正在获取 Javascript 而不是来自某个远程服务器的数据。
然后,在前端,我需要在 ajax 请求中设置那些 jsonp 和 jsonpCallback 变量。但我认为没有必要使用 jsonpCallback 变量定义的实际回调函数?
谢谢!
-= 戴夫 =-
【问题讨论】:
-
我有一个相关的问题......这可能是根本原因的一部分......是......当基本上没有数据时,PHP后端应该发回什么?现在,我让它发回“jsonpCallback();”
-
好吧,不管怎样,我已经让所有三个浏览器停止为我的一个 ajax 请求出错。 (希望我能够调整其他请求并修复它们。):我删除了 jsonpCallback 函数,该函数实际上是为了响应其中一个浏览器的错误而编写的。然后我在后端调整了我的脚本,这样当没有数据时,而不是发回“jsonpCallback();”它会发送一个 json_encoded 数组 $msg_object= array('status' => false);
-
你强行定义jSONPCallback的值有什么原因吗? jQuery 通常将它自己设置为避免在它自己的代码中发生冲突。从 api.jquery.com/ajax 可以看到:最好让 jQuery 生成一个唯一的名称,因为这样可以更轻松地管理请求并提供回调和错误处理
-
啊……我想我明白你在说什么了。 'jsonp' = 我们要在 GET 或 POST 中传递给后端脚本的变量(用于 jsonp 回调函数)的“名称”。我已经为“jsonpCallback”分配了一个值,认为我需要手动分配它以便将其传递给后端。你是说这不是,对吧?这是有道理的,因为我刚刚看到了一些时髦的东西:我输入了一行代码来将对象转储到我的一个 ajax 调用中。然而,当我执行该函数时,有时我会看到来自其他 ajax 请求的对象被打印出来!
-
埃里克,你应该将你的回复作为答案发布,这样我就可以给你信用了。显然,我不能给你一个“评论”的功劳。但是删除我对“jsonpCallback”键的手动分配解决了我的问题。 (难怪我对我的东西 25% 的时间都在工作这一事实感到困惑!)