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

时间:2012-02-19 08:19:07

标签: 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>  

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

document.body.removeChild(document.body.lastChild);  

但它不起作用。

我认为这可能是因为内容脚本在最后一个脚本行执行后运行。然后我尝试将run_at设置为document_startdocument_end,但这些都不适合我..

2 个答案:

答案 0 :(得分:4)

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

  

重要提示

     

无法以任何方式直接访问Chrome内容中的window对象   我测试了很多方法,唯一可靠的方法是通过动态创建的脚本标记注入代码。有关详细信息,请查看this answer或我的扩展程序source code

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

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

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

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

<小时/>

Chrome 17中的错误 Bug #115452 Fixed!

在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>

答案 1 :(得分:0)

我认为值得一提的是相对较新的元数据项// @unwrap,它将用户脚本从用户脚本正常运行的沙箱中取出。更多信息:

https://wiki.greasespot.net/Metadata_Block#.40unwrap