我正在尝试学习JSONP。从我的在线研究中,我了解到它使用callback调用函数。除了JSON之外的所有其他内容(处理数据的方式/数据格式)?
我正在玩JSONP,如下所示。但它返回错误,请详细解释,请...
的script.js
function test(){
jQuery.ajax({
url: "/plugins/system/chat/jsonstr.php",
dataType: "jsonp",
jsonpCallback: "logResults"
});
jsonstr.php
logResults(){
$arr = '[{
"title": "keren",
"picture": "http://something.png",
"id":1
}, {
"title": "diana",
"picture": "/plugins/system/conversekit/conversekit/images/avatar.png",
"id": 2
}]';
echo $arr;
}
我希望这个调用返回json对象,以便我可以在test的成功函数中操作它。但是抛出如下错误:
<br />
<b>Parse error</b>: syntax error, unexpected '{' in <b>C:\projects\easysocial.com\plugins\system\conversekit
\jsonstr.php</b> on line <b>14</b><br />
控制台中的网址如下:
GET http://mysite.localhost.com/plugins/system/chat/jsonstr.php?callback=logResults
答案 0 :(得分:2)
logResults()是JavaScript回调,而不是PHP函数。 jsonstr.php应该只返回有效的JSON。
所以jsonstr.php看起来应该是这样的
<?php
$arr = [
[
'title' => "keren",
'picture' => "http://something.png",
'id' => 1,
],
[
'title' => "diana",
'picture' => "/plugins/system/conversekit/conversekit/images/avatar.png",
'id' => 2,
],
];
echo(json_encode($arr));
和Script.js
function logResults() {
console.log('ajax done');
}
function test(){
jQuery.ajax({
url: "/plugins/system/chat/jsonstr.php",
dataType: "jsonp",
jsonpCallback: logResults
});
}
答案 1 :(得分:1)
两个问题:
您的服务器端脚本不会返回任何内容,因为浏览器开发人员工具中的 Net 窗格应显示。
JSONP只是一个肮脏的技巧,可以避免AJAX中的跨站点权限问题,而不是让PHP代码与JavaScript交互的方法(这是不可能的)。因此,当您说“我想要一个名为 logResults 的回调函数”时,您的意思是 JavaScript 函数。
如果你想使用JSONP,你需要:
让您的服务器实际返回JSONP(甚至不是JSON):
$callback = filter_INPUT(INPUT_GET, 'callback');
// ...
echo sprintf('%s(%s);', $callback, $json);
定义一个JavaScript函数来处理返回的数据:
function logResults (data) {
alert(data[0].title);
}
通过这种方式,您基本上可以获得一个动态生成的旧<script>
标记,用于加载一个简单的脚本:
logResults([{
"title": "keren",
"picture": "http://something.png",
"id":1
}, {
"title": "diana",
"picture": "/plugins/system/conversekit/conversekit/images/avatar.png",
"id": 2
}]);
但是,因为您在自己的域中进行了AJAX调用:
url: "/plugins/system/chat/jsonstr.php",
^^
No "http://example.com/` prefix pointing to a third-party site
...你根本不需要JSONP :普通的JSON就足够了。