使用Chrome的用户脚本劫持变量

时间:2012-05-07 16:58:19

标签: javascript google-chrome userscripts content-script

我尝试使用用户脚本更改页面中的变量。 我知道在源代码中有一个变量

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

1 个答案:

答案 0 :(得分:22)

Content scripts(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);