只执行一次函数

时间:2012-08-24 23:33:28

标签: javascript greasemonkey

我正在编写一个greasemonkey脚本,并且只想在页面加载后调用 start 函数 - 这是针对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++;

,但这些方式都不起作用。

我做错了什么?我现在在欧洲 - 那天晚上,所以我稍后会回答你的问题。

1 个答案:

答案 0 :(得分:3)

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

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

此外,无需使用jQuery(document).ready(),因为除非您将脚本注入目标页面,否则Greasemonkey默认会在document.ready处触发。

解决多次运行问题:

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

    if (window.top != window.self)  //-- Don't run on frames or iframes.
        return;