我有一段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.
}
有什么建议吗?
答案 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();
}