Что делает это окно ["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-подобные данные из любого домена, который будет возвращать их в этом формате.

Другие вопросы по тегам