Javascript 使用Chrome的用户脚本劫持变量
我正在尝试使用用户脚本更改页面中的变量。 我知道在源代码中有一个变量Javascript 使用Chrome的用户脚本劫持变量,javascript,google-chrome,userscripts,content-script,Javascript,Google Chrome,Userscripts,Content Script,我正在尝试使用用户脚本更改页面中的变量。 我知道在源代码中有一个变量 var smilies = false; 理论上我应该可以这样改变它: unsafeWindow.smilies = true; 但它不起作用。当我试图在不劫持的情况下向控制台发出警报或记录变量时,我发现它是未定义的 alert(unsafeWindow.smilies); // undefined !!! 编辑:如果Chrome有任何变化,我将使用它… 说: 内容脚本在称为隔离脚本的特殊环境中执行 世界。他们可以访问所
var smilies = false;
理论上我应该可以这样改变它:
unsafeWindow.smilies = true;
但它不起作用。当我试图在不劫持的情况下向控制台发出警报或记录变量时,我发现它是未定义的
alert(unsafeWindow.smilies); // undefined !!!
编辑:如果Chrome有任何变化,我将使用它…
说:
内容脚本在称为隔离脚本的特殊环境中执行
世界。他们可以访问所注入页面的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);
在(Chrome extensions)中,页面的全局窗口对象和内容脚本的全局对象之间有严格的分隔
- 要插入代码
- 覆盖变量很简单。
为了防止变量被覆盖,覆盖变量需要使用
最终内容脚本的代码:
// 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);
smilies
它不是函数中声明的变量?不,它不在函数中。对于较长的函数,请使用自执行格式scriptText='('+fn+')();'
其中fn
是扩展中的任何(可能是长的)函数。感谢您非常详细的回答!!!我已经从(我相信是你)给我的链接中解决了我的问题。有趣的是,我不需要使用Object.defineProperty使其工作,我想知道为什么。。。编辑:好的,你也写过。再次感谢大家@BadrHariObject.defineProperty
仅在要防止变量被覆盖时才是必需的。当前,在声明页面的smiley
变量之前执行脚本时,该变量将被页面覆盖。使用Object.defineProperty
可以防止这种情况发生。@这取决于具体情况。如果要在变量存在之前设置它,请务必使用“run\u at”:“document\u start”
。如果要在定义变量后覆盖该变量,使用“document\u end”
或“document\u idle”
可能会起作用。