2012-08-24 109 views
1

我正在写一个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

这是星期五,熬夜晚了一点':P'(我是欧洲,太) –

+0

我试图这样做。 – Jakub

回答

3

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

试图跟踪这种状态没有意义,除非您故意多次调用该函数(问题中未显示),否则该函数将只在每个脚本执行时运行一次。脚本通常不能在执行实例之间共享信息(这里也不需要)。

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

为了解决多个运行问题:

  1. 调整你的@include@exclude@match指令,以消除许多不想要的I帧,你可以合理。
  2. 添加这样的代码靠近你的脚本的顶部:

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

嘿布罗克亚当斯。感谢您的评论。它帮助我,现在我的脚本只执行一次。 – Jakub

+1

不客气。乐意效劳。 –