【问题标题】:JSONP callback is returning errorJSONP 回调返回错误
【发布时间】:2016-07-08 16:24:48
【问题描述】:

我正在尝试学习 JSONP。根据我的在线研究,我了解到它是带有回调的调用函数。除此之外,其他一切(处理数据的方式/数据格式)类似于 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 对象,以便我可以在测试的成功函数中对其进行操作。但是会抛出如下错误:

<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 />

控制台中的url是这样的:

GET http://mysite.localhost.com/plugins/system/chat/jsonstr.php?callback=logResults

【问题讨论】:

  • jsonpCallback: "logResults" ==> jsonpCallback: logResults
  • echo $arr; ==> echo json_encode($arr);
  • @Tushar, jsonpCallback: logResults, 说“ReferenceError: logResults is not defined”

标签: javascript php jquery json ajax


【解决方案1】:

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
    });
}

【讨论】:

  • 如果我想使用jsonstr.php作为API,我将定义多个函数..那么我如何通过jsonp调用特定函数?
  • 您可以使用 GET 参数,例如/plugins/system/chat/jsonstr.php?method=get_users。您可以在 PHP 中添加任何逻辑,但最终返回 JSON。
  • 在 PHP 中你可以找到像这样的 GET $_GET['method']
  • 我可以知道为什么回调函数什么都不做吗?
  • 我在答案中编辑了 Script.js。它应该像这样工作,虽然我没有测试它。
【解决方案2】:

两个问题:

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

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

如果你想使用 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);
    }
    

这样你基本上得到一个动态生成的旧&lt;script&gt;标签,它加载一个简单的脚本:

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 就足够了。

【讨论】:

  • Alvaro 你是对的,我的服务器脚本没有返回任何东西,因此 logResults 函数没有做它应该做的事情。我只在控制台中看到响应。我试过你的回答没有调用回调,但无济于事
  • @Keren 在(希望)了解混乱的来源之后,我已经彻底修改了我的问题。
  • 哦...我只是在做一些清理工作,因为我认为您已将其整理好(您已将答案标记为已接受)。 解析错误意味着你的PHP代码没有有效的语法,甚至无法运行。
  • 非常感谢 Alvaro,我选择使用 JSON/notmal ajax 调用代替 jsonp
猜你喜欢
  • 2012-06-30
  • 2012-02-16
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 2011-10-11
  • 2011-12-19
  • 2013-10-21
  • 1970-01-01
相关资源
最近更新 更多