【问题标题】:Making sure a javascript function is not called, if called already确保不调用 javascript 函数(如果已调用)
【发布时间】:2011-09-29 22:44:00
【问题描述】:

我正在为一个项目使用谷歌地图。我需要能够隐藏和显示多个地图。我不能单独使用基本的 toggleDiv 类型函数。这是因为当 div 设置为 display: none from CSS 时,Google 地图将忽略 div 的预期大小。 (无论出于何种原因,通过 javascript 切换都可以。)我可以使用 GSize(width, height) 但它不能处理百分比。因为我需要地图是 100%、100%,所以这不是一个选项。我想出了一种解决方法,即使用 onClick 调用第二个地图的函数,而不是使用 body onLoad 加载所有函数。但是,地图的缩放没有保存,地图只是重新加载。

所以,我需要检查一个函数是否被调用,如果是,不要调用它。我无法弄清楚如何做到这一点。任何帮助表示赞赏。

谢谢。

【问题讨论】:

  • 你能控制这个函数的代码吗?
  • 对于更漂亮的解决方案 - 请参阅 teresko 的答案。跟踪变量保留在函数内部,不会使外部范围混乱。

标签: javascript


【解决方案1】:

另一个“lazyvariant

var doOnce = function () {
    // do something

    doOnce = function () {}
}

至于原来的问题,如果你要运行一次的函数是点击事件处理器,你最好remove the click event listener

【讨论】:

    【解决方案2】:

    这样定义一个变量。 var beenFired = false;

    在函数中这样做:

    function myFunction()
    {
        if(!beenFired)
        {
            //TODO FUNCTION
            beenFired = true;
        } 
    }
    

    这将检查是否还没有被触发,如果没有触发它。你甚至可以围绕函数调用本身来做。

    if(!beenFired)
        myFunction()
    
    function myFunction()
    {
        //TODO FUNCTION
        beenFired = true;
    }
    

    【讨论】:

    • 我真的只是想通了。我试图回答我自己的问题,但它不会让我。谢谢!
    • 我相信您可以回答自己的问题,但必须经过一段时间后。您可以随时编辑原始问题以包含其他发现。
    • 是的,你可以这样做,就像@jfriend00 说你必须等待一段时间。
    • 是的,我正要编辑它,但看到这么多人回答没关系。有时你只需要在你得到那个砰砰声之前把它说出来!片刻。感谢所有回复。
    【解决方案3】:
    var func = (function(){
        var first = true;
        return function( a, b, c){
            if ( !first ){
                return;
            }
            first = false;
    
            console.log( arguments );
        }
    })();
    
    func( 1, 2, 3); // in console : [ 1, 2, 3]
    func( 1, 1, 1); // nothing happens;
    

    【讨论】:

    • 这是浪费计算(每次调用都会评估条件),请参阅下面的答案。
    【解决方案4】:

    如果我明白了:

    var isCalled = false;
    
    function f() {
      if (!isCalled) {
        isCalled = true;
        // ...
      }
    }
    

    【讨论】:

    • 哦,首先我想,有必要在一个时刻只保留一个工作功能。谢谢,我已经修好了。
    • 单次?你的意思是在 Ajax 请求期间?
    • 我的意思是防止在第一个函数运行时第二次调用该函数。某些事件处理程序通常是这种情况。但我仔细阅读了问题并修正了我的答案。
    • 只要确保您了解在同步环境(即 JavaScript)中不能同时调用。
    • 是的,我明白了。 JS 是同步的。但正如您在第三条评论中所说,它可能是 func 主体中的 ajax 调用。
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多