Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Chrome的用户脚本劫持变量_Javascript_Google Chrome_Userscripts_Content Script - Fatal编程技术网

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使其工作,我想知道为什么。。。编辑:好的,你也写过。再次感谢大家@BadrHari
Object.defineProperty
仅在要防止变量被覆盖时才是必需的。当前,在声明页面的
smiley
变量之前执行脚本时,该变量将被页面覆盖。使用
Object.defineProperty
可以防止这种情况发生。@这取决于具体情况。如果要在变量存在之前设置它,请务必使用
“run\u at”:“document\u start”
。如果要在定义变量后覆盖该变量,使用
“document\u end”
“document\u idle”
可能会起作用。