11

ユーザースクリプトを使用してページ内の変数を変更しようとしています。ソースコードに変数があることを知っています

var smilies = false;

理論的には、次のように変更できるはずです。

unsafeWindow.smilies = true;

しかし、それは機能しません。ハイジャックせずに変数をコンソールにアラートまたはログに記録しようとすると、未定義であることがわかります。

alert(unsafeWindow.smilies); // undefined !!!

編集:何かが変わる場合はChromeを使用しています...

http://code.google.com/chrome/extensions/content_scripts.htmlによると:

コンテンツスクリプトは、孤立した世界と呼ばれる特別な環境で実行されます。挿入されたページのDOMにはアクセスできますが、ページによって作成されたJavaScript変数や関数にはアクセスできません。各コンテンツスクリプトは、実行中のページで実行されている他のJavaScriptがないかのように見えます。

Chrome拡張機能についてですが、ユーザースクリプトでも同じ話だと思いますか?

ありがとう、Rob W.それで、それを必要とする人々のための実用的なコード:

var scriptText = "smilies = true;";
var rwscript = document.createElement("script");
rwscript.type = "text/javascript";
rwscript.textContent = scriptText;
document.documentElement.appendChild(rwscript);
rwscript.parentNode.removeChild(rwscript);
4

1 に答える 1

26

コンテンツスクリプト(Chrome拡張機能)では、ページのグローバルwindowオブジェクトとコンテンツスクリプトのグローバルオブジェクトが厳密に分離されています。

最終的なコンテンツスクリプトのコード:

// This function is going to be stringified, and injected in the page
var code = function() {
    // window is identical to the page's window, since this script is injected
    Object.defineProperty(window, 'smilies', {
        value: true
    });
    // Or simply: window.smilies = true;
};
var script = document.createElement('script');
script.textContent = '(' + code + ')()';
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);
于 2012-05-07T17:14:47.313 に答える