仅运行一次javascript代码

时间:2014-05-16 17:12:22

标签: javascript

我有一段js代码&我希望它只运行一次。因为这个js代码包含一个if语句

if( abc.xyz && xyz.pqr)
{
//do something
}

现在,abc.xyz& xyz.pqr是第三方函数,由我的页面上的第三方代码调用两次&因此我写的jscode也运行了两次。现在我无法控制第三方功能。但是我需要在我的js代码中使用它们,但我希望我的代码只运行一次。我尝试使用下面的代码,但对我不起作用:

var doneTheStuff;

    if(!doneTheStuff){
    doneTheStuff= true;
    //my code
    // my code fires a pixel which i can see in Charles
    // because of the third party functions called twice on the page
    // my code runs twice & drops 2 pixels instead of 1 which I can see in charles.
    }

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

您可以Underscore.js once() method用户执行此操作。

var doStuff = _.once(function() {
  if( abc.xyz && xyz.pqr) {
    //do something
  }
});

如果你想知道它是如何工作的,你可以自己浏览一下:

http://underscorejs.org/docs/underscore.html#section-73

  _.once = function(func) {
    var ran = false, memo;
    return function() {
      if (ran) return memo;
      ran = true;
      memo = func.apply(this, arguments);
      func = null;
      return memo;
    };
  };

答案 1 :(得分:0)

我不确定我是否理解你的问题,但我经常做的是将包含代码的函数分配给变量,并在我的函数内部将变量重新分配给“不执行任何操作”功能 - 从而保证它只执行一次。

var doStuff = function(){
    if( abc.xyz && xyz.pqr)
    {
       //do something
    }
    doStuff = function(){};   
}

如果再次调用doStuff,那么就不会发生任何事情。

修改

我添加了一个JSFiddle来说明这个概念:http://jsfiddle.net/4R6Nf/

实际上这是代码:

var div = document.getElementById('output');
var div2 = document.getElementById('output2');
var doit = true;
var k = 0;
var doStuff = function(){
    if( doit)
    {
        div.innerHTML = "count now: "+k;
    }
    doStuff = function(){
        k++;
        div2.innerHTML = "doStuff count now: " +k
    };   
}

var items = [0,1,2,3,4,5];

for(var i=0;i<items.length;i++){
    doStuff();    
}

div2将输出“doStuff count now:5”,而div将始终显示“count now:0”。而不是doStuff什么都不做 - 它现在递增k变量。但你可以得到这个想法。

答案 2 :(得分:0)

您也可以采用OOP方式,避免出现全局变量或范围问题:

function Pixel() {
    this.firstTime = true;

    this.fire = function () {
        // This code will run once for this instance
    };

    if (this.firstTime) {
        this.firstTime = false;
        this.fire();
    }
}

var pixel = new Pixel();

if( abc.xyz && xyz.pqr) {
    pixel.fire();
}