使用unsafeWindow使用Greasemonkey插入多个javascript函数时出现问题

时间:2011-05-19 02:26:52

标签: javascript greasemonkey

问题是这些功能似乎无法互相看见。

例如:

unsafeWindow.helloworld = function() {

    alert('Hello world!');

    helloworld2();//fails with error saying it does not exist
}

unsafeWindow.helloworld2 = function() {

    alert('Hello world!2');

    helloworld();//fails with error saying it does not exist
}

insert("helloworld();"); //appends a script element to the body

这两个函数都可以使用insert或firebug控制台调用,但是他们内部不了解彼此吗?这有什么问题?

2 个答案:

答案 0 :(得分:1)

如果您格式化代码,那将会有很大帮助:

> unsafeWindow.helloworld = function() {
> 
>     alert('Hello world!');
> 
>     // fails with error saying it does not exist
>     helloworld2(); 
> }
> 
> unsafeWindow.helloworld2 = function() {
> 
>     alert('Hello world!2');
> 
>     //fails with error saying it does not exist
>     helloworld();
> 
> }

你有无限递归函数 - helloworld 调用 helloworld2 ,它调用 helloworld ,所以 ad无限。< / p>

但无论如何,您设置的属性为unsafeWindow

unsafeWindow.helloworld = function() {

但后来尝试使用在作用域链上解析的非限定标识符来调用它:

[... later, in helloword2 ...]

      helloworld();

因此,在调用helloworld时创建的执行/变量对象的范围链上解析标识符unsafeWindow.helloworld2

因此helloworld设置为unsafeWindow属性。调用该函数时,将使用函数的范围链解析标识符helloworld2

在浏览器中,窗口/全局对象位于作用域链上,因此可以在那里找到变量名称(即,如果在作用域链中没有找到变量,则变量可以解析为全局对象的属性),但我怀疑当{调用{1}},其范围链以文档的全局对象结束,而不是unsafeWindow.helloworld。否则对文档中函数的调用也会在其作用域链上有unsafeWindow,这对我来说似乎不对。

或者我可能完全错了。 : - )

答案 1 :(得分:1)

存在多个问题。

  1. 由于函数是在unsafeWindow范围内定义的,因此必须在Greasemonkey脚本中以这种方式调用它们。
    像这样:

    unsafeWindow.helloworld = function () {
    
        alert ('Hello world!');
        unsafeWindow.helloworld2 ();
    }
    
    unsafeWindow.helloworld2 = function () {
    
        alert ('Hello world!2');
        unsafeWindow.helloworld ();
    }
    


  2. insert()来自哪里?!要调用这些函数,您可以使用:

    // WARNING this will launch an infinite loop!!
    unsafeWindow.helloworld2 ();
    


  3. 不要这样做!以这种方式定义函数的唯一原因是覆盖/覆盖目标页面上已有的函数。在极少数情况下,当您想要覆盖网站的JavaScript时,最好的方法取决于细节。

    您可以使用许多unsafeWindow转义(如图所示)或rewrite functions en masse,但最好的方法通常只是删除页面的功能:
    unsafeWindow.badFunc = function () {}
    并在GM脚本范围中替换/添加更改的功能。


  4. 但对于目前发布的问题,您无需执行任何操作。根据显示的内容,脚本将是:

    helloworld = function () {
    
        alert ('Hello world!');
        helloworld2 ();
    }
    
    helloworld2 = function () {
    
        alert ('Hello world!2');
        helloworld ();
    }
    
    // WARNING this will launch an infinite loop!!
    helloworld2 ();