停止使用Chrome扩展程序执行的功能

won*_*ng2 5 javascript google-chrome google-chrome-extension

这是一个简单的页面:

<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test page</title>
    <script type="text/javascript">
        function foo (num) {
            alert(num);
        }
    </script>
</head>
<body>
    Hello World
    <script type="text/javascript">
        foo(2);
    </script>
</body>
</html>  
Run Code Online (Sandbox Code Playgroud)

我想写一个Chrome扩展程序,以防止执行底部脚本(foo(2)).
我尝试编写一个内容脚本,删除最后一个脚本标记:

document.body.removeChild(document.body.lastChild);  
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

我想这可能是因为内容脚本在最后一个脚本行执行后运行.然后我试着设置run_atdocument_startdocument_end,但它们都不适合我..

Rob*_*b W 5

我在开发Don't track me Google User 脚本/扩展时遇到了同样的问题。

#重要说明windowChrome 内容脚本中的对象不能以任何方式直接访问。
我测试了很多方法,唯一可靠的方法是通过动态创建的脚本标签注入代码。查看此答案或我的扩展程序的源代码以获取更多信息。

我通过使用解决了它Object.defineProperty。使用此方法,您可以定义一个属性,并指定有关 getter、setter 和属性描述符的信息。在你的情况下:

Object.defineProperty(window, 'foo', {
    value: function(){/*This function cannot be overridden*/}
});
Run Code Online (Sandbox Code Playgroud)

或者,如果您想捕获该变量,并在以后使用它:

(function() {
    var originalFoo = function(){/*Default*/};
    Object.defineProperty(window, 'foo', {
        get: function(){
            if (confirm('function logic')) return function(){/*dummy*/};
            else return originalFoo;
        },
        set: function(fn){originalFoo = fn;}
    });
})();
Run Code Online (Sandbox Code Playgroud)
##Bug 在 Chrome 17 [Bug #115452](http://code.google.com/p/chromium/issues/detail?id=115452) [已修复!](http://code.google.com/p /chromium/issues/detail?id=115452#hc4) 在 Chrome 17 中,使用 V8 3.7.12.12(但不是在 Chrome 16 中,使用 V8 3.6.6.19),**函数声明覆盖属性描述符**。
请参阅 http://jsfiddle.net/bHUag/
请注意,当函数声明和属性描述符方法位于同一块中时,此错误 *似乎* 不适用。不过,这是错误的。效果是不可见的,因为函数声明总是在代码块之前进行评估。因此,首先评估 `function foo(){}`,然后是其余的代码。
<script>
Object.defineProperty(window, 'foo', {value: function(){return 5;} });
</script><script>
function foo(){return 1};
alert(foo()); // Shows 5 in all browsers except for Chrome v17
</script>
Run Code Online (Sandbox Code Playgroud)