2

我正在编写一个greasemonkey 脚本,并且只想在页面加载后调用一次启动函数——它是针对facebook 的。首先,我从以下代码开始:

function start(){
    alert("hello");
}

start();

start() 函数执行了不止一次。所以我将代码更改为以下内容:

jQuery.noConflict();
window.stoop = 0;
jQuery(document).ready(function(){
    if(window.stoop == 0){
        start();
    }
    window.stoop = 55;
    //or window.stoop++;
});


function start(){
    alert("hello");
}

问题是 window.stoop 值不会改变。

我试过了

var stoop = 0;
stoop++;

var obj = {};
obj.stoop = 0;
obj.stoop++;

也是,但这些方法都不起作用。

我究竟做错了什么?我现在在欧洲——现在是晚上,所以我稍后会回答你的问题。

4

1 回答 1

3

问题是您的整个 Greasemonkey 脚本执行了不止一次。Greasemonkey 将在 iframe 上运行,就像它们是主页一样 - 如果 iframe 与脚本的@include@exclude@match指令匹配。

尝试像这样跟踪状态是没有意义的,该函数只会在每次脚本执行时运行一次,除非您故意多次调用它(问题中没有显示)。并且脚本通常不能在执行实例之间共享信息(这里也不需要)。

此外,没有必要使用jQuery(document).ready(),因为除非您将脚本注入目标页面,否则document.ready默认情况下会触发 Greasemonkey。

要解决多次运行问题:

  1. 调整您的@include@exclude@match指令,以尽可能多地消除不需要的 iframe。
  2. 在脚本顶部附近添加这样的代码:

    if (window.top != window.self)  //-- Don't run on frames or iframes.
        return;
    
于 2012-08-25T01:59:34.470 回答