JSONP回调返回错误

时间:2016-07-08 07:17:32

标签: javascript php jquery json ajax

我正在尝试学习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

2 个答案:

答案 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)

两个问题:

  1. 您的服务器端脚本不会返回任何内容,因为浏览器开发人员工具中的 Net 窗格应显示。

  2. JSONP只是一个肮脏的技巧,可以避免AJAX中的跨站点权限问题,而不是让PHP代码与JavaScript交互的方法(这是不可能的)。因此,当您说“我想要一个名为 logResults 的回调函数”时,您的意思是 JavaScript 函数。

  3. 如果你想使用JSONP,你需要:

    1. 让您的服务器实际返回JSONP(甚至不是JSON):

      $callback = filter_INPUT(INPUT_GET, 'callback');
      // ...
      echo sprintf('%s(%s);', $callback, $json);
      
    2. 定义一个JavaScript函数来处理返回的数据:

      function logResults (data) {
          alert(data[0].title);
      }
      
    3. 通过这种方式,您基本上可以获得一个动态生成的旧<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就足够了。