【问题标题】:Alternative to using eval with jsonp response将 eval 与 jsonp 响应一起使用的替代方法
【发布时间】:2017-01-11 15:43:40
【问题描述】:

我有以下回应:

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

如何从中检索 JSON?我可以从字符串中删除函数名并仅获取 JSON,但我认为这不是 JSONP 的最佳解决方案。我可以使用eval 来调用someFunc 函数,但话又说回来,eval 不好。我该怎么做?

【问题讨论】:

  • safe(r) 解决方案是一个带有允许函数的 case 语句
  • 你是如何得到这个值的?你在调用一些远程资源吗?通常您会在代码中定义someFunc 函数,然后将远程资源作为script 标记的src 属性提供,您将动态注入到您的DOM 中。然后您定义的someFunc 将被自动调用,并传入所需的对象作为参数。

标签: javascript json jsonp


【解决方案1】:

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

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

首先定义一个函数:

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,以便您提前知道如何命名您的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 2015-12-20
    • 1970-01-01
    • 2011-06-02
    • 2015-12-18
    相关资源
    最近更新 更多