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);
}

ここに投稿した script タグの前で、関数 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()定義された関数を呼び出すことと同等です。obvInit

スクリプトは同一生成元ポリシーの対象ではないため、この形式で返される任意のドメインから JSON のようなデータを取得できるようになりました。

于 2016-07-11T17:06:07.357 に答える