从Javascript调用JSONP Ajax回调函数

4
我正在尝试发送一个JSONP Ajax请求(从client.htm到proxy.htm),由代理页面接收,然后创建另一个不同的Ajax JSONP请求到服务端(proxy.htm ---> service.php)。目前代理页面接收到了来自服务端的JSON格式对象,但我无法将该对象返回给最初的Ajax请求。以下是我正在尝试运行的示例代码。请问Javascript可以实现吗?如果可以,如何将对象返回给clientCallback函数?

Client.htm

// CLIENT ---> PROXY
$(document).ready(function () {
     $.ajax({
            type: 'GET',
            url: 'http://localhost/jsonp_proxy/listener.htm',
            dataType: 'jsonp',
            jsonpCallback: "clientCallback",
            success: function (theData) {
              alert("Success");
            },
            error: function (xhr, ajaxOptions, thrownError) {
              alert("Error");
            }
        });
      });
      window.clientCallback = function(results) {
        alert(results.uid);
      }

Proxy.htm

      // PROXY ---> SERVER
      $(document).ready(function () {
        $.ajax({
          type: 'GET',
          url: 'http://localhost/jsonp_server/service.php',
          dataType: 'jsonp',
          jsonpCallback: "proxyCallback",      
          success: function (theData) {
//          alert("Success");
          },
          error: function (xhr, ajaxOptions, thrownError) {
//          alert("Error");
          }
        });
      });
      window.proxyCallback = function(resultData) {
        // HOW TO CALL CLIENT CALLBACK FUNCTION
      }

Service.php

<?php
echo "proxyCallback("."{'uid': 123, 'username': 'jdirt', 'name': 'Joe Dirt'}".");";
?>
2个回答

1

在 IT 相关领域,eval 的用途是少数几个半合理的用途之一:

success: function (theData) {
  eval("(" + theData + ")");
  //alert("Success");

提醒一下,JSONP 是一种黑客行为和安全风险。您正在将很多信任和控制权交给第三方。


谢谢回复,但这并没有返回到客户端的client.htm页面。Ajax进入了错误函数。 - Manny
永远不要使用eval()。请使用JSON.parse()。 - saml
@saml -- 通常我会同意,但是JSONPJSON有些不同。 JSONP可执行代码,必须进行eval,因为它包含一个内部回调处理程序。 - Jeremy J Starcher
@JeremyJStarcher JSONP请求永远不会直接返回源代码,除非通过传递某些参数到你所请求的函数中。你不能使用eval函数,因为成功和失败回调只有在浏览器完成从远程服务器加载代码后才会被触发,即使回调本身抛出异常也是如此。 - saml

0
只需从window.proxyCallback中调用window.clientCallback即可。

“不起作用”是描述失败的极为模糊的方式。具体发生了什么?你所期望的结果出了什么问题?你实际尝试了什么? - saml
好的,我尝试从window.proxyCallback调用window.clientCallback,但是当我浏览client.htm时,请求进入请求的错误函数。我尝试在不使它们全局的情况下调用这些函数,但结果相同。从PHP页面调用proxyCallback可以正常工作,但我似乎找不到用JavaScript做同样事情的方法。 - Manny
为什么你要用jsonp呢? - saml
大部分是基于一个稍作修改的现有服务。实际服务是用C#编写的,并带有一个使用JSONP从服务获取数据的示例网页。请注意,网页和服务都是完整的,但由于设计(超出我的控制范围),我发现自己试图使其工作。根据您的问题和其他回复,似乎这不是最佳方法,这是正确的吗?如果是,那么有什么更好的方法? - Manny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接