我必须使用JQuery和PHP创建一个带有跨域AJAX请求的Web应用程序。所以,我使用JSONP来做我的请求。它适用于Firefox,但不适用于Chrome和Opera。
我有一个执行请求的功能:
function update()
{
$.ajax({
url : url,
type : "GET",
dataType: "jsonp",
crossDomain : true,
jsonpCallback : "updateCallback",
async : false,
data : {'session_id' : sessionID,'user' : userName },
error : function (xhr, status, error) {
alert("Erreur de chargement du fichier '"+url+"' : "+xhr.responseText+" ("+status+" - "+error+")");
},
success: function(){
alert("Success !");
}
});
}
这是回调函数:
function updateCallback(data)
{
var i = 0;
var messages = data.messages;
while(i < data.messages.length){
appendMessage(data.messages[i]);
i++;
}
saveLastMsgID = lastMsgID;
doUpdate = updateInProgress = false;
}
AJAX请求调用的PHP脚本:
<?php
/* ... */
function sendResponse($messages,$date)
{
header('content-type: application/json; charset=utf-8');
header("Access-control-allow-origin: *");
header ("Access-Control-Allow-Headers: x-requested-with", true);
header('Access-Control-Allow-Methods: GET,OPTIONS');
$datas = array();
for($i = 0 ; $i < count($messages) ; $i++){
$msg = $messages[$i];
$message = null;
$message->sender = $msg->getSender();
$message->date = $date;
$message->msg = stripslashes($msg->getContent());
$message->carrier = $carrier;
$datas[] = $message;
}
$data->messages = $datas;
echo $_GET['callback']. '('. json_encode($data) . ')';
}
?>
感谢您的帮助!
答案 0 :(得分:3)
男人,你那里有很多东西。这不是必要的。试试这个。它让jQuery处理你的回调,这样成功函数就会传递响应中嵌入的JSON所代表的对象:
function update()
{
$.ajax({
url : url,
dataType: "jsonp",
// async : false, <-------- THIS IS IGNORED BY JQUERY DUE TO JSONP DATATYPE
data : {'session_id' : sessionID,'user' : userName },
success: function(data){
// alert("Success !");
var i = 0;
var messages = data.messages;
while(i < data.messages.length){
appendMessage(data.messages[i]);
i++;
}
saveLastMsgID = lastMsgID;
doUpdate = updateInProgress = false;
}
});
}
答案 1 :(得分:2)
JSON-P不是JSON。它是嵌入在JavaScript程序中的JSON。 MIME类型应为application/javascript
。
Chrome和Opera可能会对尝试将函数调用注入JSON字符串做出反应。
答案 2 :(得分:2)
我想知道您是否在浏览器中安装了任何adblock插件,并且您的请求网址包含一些关键字,例如“ad”。
我遇到了类似的问题,终于发现这是adblock造成的问题。