替代使用eval和jsonp响应

时间:2017-01-11 15:43:41

标签: javascript json jsonp

我有以下回应:

someFunc({"attr":"val"});

如何从中检索JSON呢?我可以从字符串中删除函数名称并仅获取JSON,但我认为它不是JSONP的最佳解决方案。我可以使用eval来调用someFunc函数,但是再次eval是错误的。我该怎么做?

1 个答案:

答案 0 :(得分:2)

通常这些输入来自您的javascript应用程序将调用的远程端点。通常执行此远程调用的方法是声明具有预期名称的函数,然后动态地将script标记注入到将src属性指向远程资源的DOM中。加载资源时,它将调用您的函数将其作为参数传递给所需的对象。

我们有一个例子。假设您有一个远程端点,可以返回问题中显示的数据。

首先定义一个函数:

window.someFunc = function(result) {
    // result will represent the {"attr":"val"} object
    alert(JSON.stringify(result));
};

然后只创建一个script元素,该元素将附加到您的DOM并从远程端点启动JSONP检索:

var s = document.createElement('script');
s.setAttribute('src', 'http://example.com/some_endpoint');
document.body.appendChild(s);

脚本成功加载远程资源后,它将调用您已定义的someFunc并将结果对象传递给它。

备注:大多数启用JSONP的端点允许您通过某个查询字符串参数http://example.com/some_endpoint?callback=someFunc指定回调的名称,以便事先知道如何命名您的函数。