我对复杂的javascript并不是特别熟悉。我试图从中间URL中提取一些信息,我注意到每个页面都有以JSON格式存储的整个帖子内容。内容在页面上显示如下:
<script>// <![CDATA[
window["obvInit"]({"value":{"id":"e389ba1d8f57","versionId":"1b74...
如何从页面轻松提取此json?在json之前,窗口[“obvInit”]的前言是什么意思?我可以在我的chrome控制台中调用函数obvInit并以某种方式获取json输出吗?
对不起基本问题!
由于
答案 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的数据。