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

内容脚本window(Chrome 扩展)中,页面的全局对象和内容脚本的全局对象之间有严格的区分。

最终内容脚本的代码:

// 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 回答