Что делает это окно ["obvInit"]({...}) в скрипте?
Я не особенно знаком со сложным JavaScript. Я пытаюсь извлечь некоторую информацию из средних URL-адресов и замечаю, что на каждой странице хранится все содержимое поста в формате JSON. Содержание выглядит следующим образом на странице:
<script>// <![CDATA[
window["obvInit"]({"value":{"id":"e389ba1d8f57","versionId":"1b74...
Как мне легко извлечь этот JSON со страницы? что означает предисловие window["obvInit"] перед json? Могу ли я вызвать функцию obvInit в моей консоли chrome и как-нибудь получить вывод json?
Извините за основной вопрос!
Спасибо
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
) и принимает аргументы в виде массива. Именно то, что вам нужно, чтобы обернуть его.
Это метод, известный как JSONP. По сути, поскольку некоторые старые браузеры не имеют большой поддержки AJAX с несколькими источниками, использующими XMLHttpRequest, вы можете вставить <script>
добавьте тег на страницу, которая получает нужный вам ресурс, кроме как в виде:
functionName({ /* ...data... */ });
Так что он вызывает функцию, известную как functionName
с данными в качестве аргумента. Вы должны предоставить эту функцию в своем собственном коде перед вставкой этого скрипта, например так:
function functionName(data) {
// use the data
}
window["obvInit"]()
эквивалентно window.obvInit()
что эквивалентно вызову функции, определенной как obvInit
на глобальном уровне.
Поскольку сценарии не подчиняются политике одного и того же происхождения, теперь вы можете получать JSON-подобные данные из любого домена, который будет возвращать их в этом формате.