16

状況: どのページでも動作する chrome 拡張機能を作成しています。

問題 質問: jQuery を Facebook にロードできません。何が起こっているのかを知りたいです。

仮説: Facebook は何らかの方法で両方を検出する超高度な技術を持っています。

  1. jQuery が、表向きは別のJSVM 実行コンテキストでchrome 拡張機能を介してロードされると、Facebook メガマインドは、この表向きは別のJSVM 実行コンテキストを何らかの方法で認識し、それをブロックします。
  2. そのjQueryはscript.srcを介してロードされ、それをブロックします (方法2が機能しないjQueryの代わりにHTTPSを介して提供するGoogle CDNを使用した場合、回答には不十分です)。

データ

jQuery がロードされていないことを確認するにはどうすればよいですか?

⌘</kbd>⌥</kbd>j to bring up the console in Chrome. When I do :

    > jQuery
    >> ReferenceError : jQuery is not defined.
    > $('body')
    >> Error : Tried to get element "body" but it is not present on the page.

FacebookでjQueryをロードするにはどうすればよいですか?

方法 1 (必須ですが失敗します) :

manifest.json ファイル内の次のコードを介して:

"content_scripts"         :   [
                                  {
                                    "matches"   : ["<all_urls>"],
                                    "js"        : [ 
                                                    "javascript/jq/jquery-1.9.1.min.js",                                            
                                                    "javascript/jq/non-standard.js"
                                                  ],
                                    "all_frames": true // (or false, same failure)
                                  } 
                              ]

方法 2 (機能しますが、不十分です) :

この SO 回答 ( jQuery をコンソールにロードする) で説明されている方法を使用して、正しいプロトコルを許可するように変更します。

    var jq = document.createElement('script');
    jq.src = "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js";
    document.getElementsByTagName('head')[0].appendChild(jq);
    jQuery.noConflict();

概要

仮説 1 の可能性は非常に低いと思われます。Web ブラウザーの個別の実行コンテキストをオーバーライドすることは、重大なセキュリティの脆弱性 (サンドボックスの破壊) であり、認可される可能性は低いからです。したがって、私はおそらく偏執的であり、明白なことを見落としています。

付録(その他の関連コード)

すべてのnon-standard.js :

    $.fn.in_groups_of = function( countPerGroup ) {
        var groups = [], offset = 0, $group;
        while ( ($group = this.slice( offset, (countPerGroup + offset) )).length ) {
            groups.push( $group );
            offset += countPerGroup;
        }
        return groups;
    };

manifest.jsonの詳細:

"manifest_version"        :   2,
"permissions"             :   [
                                  "http://*/",
                                  "https://*/",
                                  "tabs",
                                  "storage",
                                  "unlimitedStorage"
                              ],
4

3 に答える 3

45

Chrome コンソールは、コンテンツ スクリプトの実行コンテキストにアクセスできないようです。

間違っています。正しい場所を見る必要があります:

Chromne 拡張機能の実行環境にアクセスする方法のアニメーション

前のスクリーンキャストは、Chrome 開発者ツールの [コンソール] タブの下部に 2 つのドロップダウン ボックスがあり、開発者ツールのコンソールの実行環境を変更するために使用できることを示しています。
左側はフレーム コンテキスト (トップ フレーム、つまり iframe など) の変更に使用でき、右側はスクリプト コンテキスト (ページ、コンテンツ スクリプトなど) の変更に使用できます。

于 2013-03-04T09:11:33.873 に答える
2

答え

私の「実験方法」に欠陥があったようです。Chrome コンソールの全知性に関する仮定は正しくありません。Chrome コンソールは、コンテンツ スクリプトの実行コンテキストにアクセスできないようです。そのため、コンソールは jQuery がページにアクセスできないことを報告していましたが、実際には、コンテンツ スクリプトの実行コンテキストからアクセスできました。

これは、コンテンツ スクリプト test.js を manifest.json に追加することで検証されました。

"content_scripts"         :   [
                                  {
                                    "matches"   : ["<all_urls>"],
                                    "js"        : [
                                                    "javascript/jq/jquery-1.9.1.min.js",
                                                    "javascript/jq/non-standard.js",
                                                    "javascript/test.js" // <-- add
                                                  ],

test.js の内容は次のとおりです。

    var jtest = $('body');
    alert(jtest);
    alert(jtest.text());

どのページに移動しても、期待どおりに 2 つのアラート ボックスが表示されます。

できます!

于 2013-03-04T05:15:48.103 に答える
0

あなたは今ではこれらすべてを知っているかもしれませんが、誰かがまだこれらが役に立つと思っていると思います.

Chrome 拡張機能では、

いくつかの「スクリプトの世界」があります。

  • 元のページ スクリプト: ページ自体のスクリプト。
  • コンテンツ スクリプト: これらのスクリプトを作成すると、ページ上で実行されます。
  • ポップアップ スクリプト: ポップアップ ページがある場合、ポップアップで実行されます。
  • バックグラウンド スクリプト: グローバル バックグラウンド ページで実行します。

Google はドキュメントに関して優れた仕事をしているため、これらすべてのスクリプトに関する大量のドキュメントhttps://developer.chrome.com/extensionsがあります。

ただし、あなたの場合、ページ スクリプトとコンテンツ スクリプトは別々の世界に存在し、DOM と一部の Chrome ネイティブ オブジェクトを共有しますが、作成する変数 (またはオブジェクト) は共有しません。

この場合、コンテンツ スクリプトに jQuery があれば、コンテンツ スクリプトで $ と jQuery をすぐに使用できます。これを使用して DOM を照会できます (ただし、一部の jQuery イベントは期待どおりに機能しない場合があります)。しかし、ページには $ と jQuery はありません ($ はあるかもしれませんが、jQuery ではありません ^^)。

上記の方法 2 では、実際に jQuery をページに挿入します。その jQuery はページ スクリプトになります。また、コンテンツ スクリプトで $ または jQuery を使用することはできません。

両方の方法を同時に使用すると、ページ スクリプトに jQuery 1 を、コンテンツ スクリプトに jQuery 2 を含めることができ、これらは 2 つの異なる jQuery インスタンスになります。混乱を招くかもしれませんが、私はいつもそうしています。

于 2016-05-21T03:15:20.260 に答える