1

我对复杂的javascript不是特别熟悉。我试图从 Medium URL 中提取一些信息,我注意到每个页面都以 JSON 格式存储了整个帖子内容。页面上的内容如下所示:

<script>// <![CDATA[
window["obvInit"]({"value":{"id":"e389ba1d8f57","versionId":"1b74...

如何轻松地从页面中提取此 json?json前window["obvInit"]的前言是什么意思?我可以在我的 chrome 控制台中调用函数 obvInit 并以某种方式获取 json 输出吗?

对不起,基本问题!

谢谢

4

2 回答 2

2

这就是调用一个函数。它可能(但不是必须)function obvInit(...){...}在全局窗口命名空间中被声明。现在解决您的问题:您可以通过覆盖这样的函数轻松提取传递的对象:

var _oldObvInit = window.obvInit;
window.obvInit = function(){
        console.log(arguments[0]); //use this to extract the object
        console.log(JSON.stringify(arguments[0])); //use this to extract JSON
        return _oldObvInit.apply(window, arguments);
}

将其放在您在此处发布的脚本标记之前以及函数 obvInit 的声明之后。

一点上下文:在每个javascript函数内部都有一个隐式变量arguments,它将函数的参数存储为一个数组。并apply调用一个函数,设置上下文 ( this) 并将参数作为一个数组。正是你需要包装它。

于 2016-07-11T17:01:17.420 回答
1

这是一种称为JSONP的技术。基本上,由于一些较旧的浏览器对使用XMLHttpRequest的跨域 AJAX 没有很好的支持,因此您可以将<script>标签插入到获取所需资源的页面中,除非像这样包装:

functionName({ /* ...data... */ });

所以它调用一个functionName以数据为参数的函数。在插入该脚本之前,您可以在自己的代码中提供此函数,如下所示:

function functionName(data) {
    // use the data
}

window["obvInit"]()相当于window.obvInit()which 相当于调用obvInit在全局级别定义的函数。

由于脚本不受同源策略的约束,您现在可以从任何会以这种格式返回的域中获取类似 JSON 的数据。

于 2016-07-11T17:06:07.357 回答