【问题标题】:is there anything special i need to do on my server to run jQuery.getJSON on a bookmarklet? [closed]我需要在我的服务器上做些什么才能在书签上运行 jQuery.getJSON 吗? [关闭]
【发布时间】:2012-12-27 05:04:38
【问题描述】:

我正在制作一个需要一些用户详细信息的书签。

我了解跨域通信的最佳选择是 jQuery.getJSON 或将表单和 iframe 附加到文档并将表单目标设置为 iframe。

我决定从 getJSON 开始,因为它看起来不那么混乱,但似乎我有一些问题。

这是我用于 json 调用的内容:

$.getJSON('http://mydomain.com/bookmarklet_getjson_functions.php', function(data) {
        alert(data);
});

这里是php页面:

echo "{";
echo "item1: ", json_encode($item1), "\n";
echo "item2: ", json_encode($item2), "\n";
echo "item3: ", json_encode($item3), "\n";
echo "}"

当我在打开 Firebug 时单击书签链接时,我得到:

GET http://mydomain.com/bookmarklet_getjson_functions.php 200 OK 116ms

但警报不会发生。

有什么线索吗?

【问题讨论】:

  • echo 输出内容之前,您可能需要将响应标头中的内容类型设置为“text/json”或“application/json”。
  • 如何在回显之前设置标题?
  • header("Content-Type: text/json");。你可能想用$.get() 尝试请求,这样你就可以指定一个错误回调。这里可能发生了我们看不到的其他事情。
  • 我会尝试使用 .get 看看效果如何..
  • 试过 $.get() 相同的确切标头似乎没有响应

标签: php javascript jquery getjson


【解决方案1】:

好的 - 在测试了其他几个示例后发现我做错了什么 - 问题是我没有返回 jquery 产生的回调 - 它被用作某种“密码”

所以解决方法基本上是:

$.getJSON('http://mydomain.com/bookmarklet_getjson_functions.php?jsoncallback=?', function(data) {
    alert(data);
});

?jsoncallback=? 中的最后一个 ? 会自动替换为稍后用作“密码”的随机函数名称

所以现在在我的 php 文件中,我首先回显回调函数,然后在 () 和括号内回显 json 格式的变量:

$toecho = array(
"firstname" => "someone",
"lastname" => "somoene's lastname"

);
//return in JSON format
echo $_GET['jsoncallback'].'('.json_encode($toecho).')';

这将回显如下内容:

jquery_37328327837823232_3236363({"firstname":"somsomeonee","lastname":"omoene's lastname"})

希望能帮助到那里的人。

【讨论】:

  • 这称为JSONP(P代表填充,这是围绕数据的函数)。函数名不是“密码”,它只是用来让客户端知道要调用哪个函数。您可以定义,该函数始终称为callback(),但通过将名称作为参数传递,您的解决方案将变得更加通用。
  • 所以你的意思是如果我设置?让我们说回调或类似的东西,我稍后可以回显这个而不是随机的东西?
  • 如果你使用 jQuery(我推荐),你应该使用 jsoncallback=? 并让 jQuery 处理函数调用。让客户决定使用哪个名称是一种很好的做法。我只是说,回调名称不是秘密。
  • 是的,我明白。谢谢你的帮助
【解决方案2】:

那个“php 页面”有点奇怪。你可以试试这个:

header('Content-Type: text/javascript');
echo json_encode(array(
    'item1' => $item1,
    'item2' => $item2,
    'item3' => $item3,
));
exit;

您应该设置响应的内容类型并正确编码要发送的数据。 (...用console.log() 代替alert() 更好地测试响应:)

【讨论】:

  • 不,它与内容类型无关,我找到了解决方案,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2021-04-22
  • 2019-06-11
  • 2011-06-25
相关资源
最近更新 更多