这个窗口[“obvInit”]({...})在脚本中做什么?

时间:2016-07-11 16:54:09

标签: javascript json medium.com

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

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

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

对不起基本问题!

由于

2 个答案:

答案 0 :(得分: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)并将参数作为数组。正是你需要包装它。

答案 1 :(得分:1)

这是一种称为JSONP的技术。基本上,由于某些较旧的浏览器不能使用XMLHttpRequest对跨源AJAX提供强大的支持,您可以在获取所需资源的页面中插入<script>标记,除非像这样包装:

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

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

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

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

由于脚本不受same-origin policy的约束,您现在可以从任何将以此格式返回的域中获取类似JSON的数据。