【问题标题】:Run javascript function only once只运行一次javascript函数
【发布时间】:2014-05-25 21:00:39
【问题描述】:

我有这个简单的javascript函数:

<script type="text/javascript">
    var popup = '0';
    if(popup == '0') {
       $(document).ready(function () {     
            $(document).on('click', '.button', function(){
                  alert('test');
                  popup = '1';
            });
       }); 
    }
</script>

<button class="button">Test</button>

我希望该功能仅在第一次点击时发出警报,但尽管我将 popup 的值更改为 1,但它仍然有效

【问题讨论】:

  • -1 jQuery 文档 api.jquery.com/one 对此进行了介绍
  • @Mathletics:有什么问题?这个问题本身就很有道理。
  • @jsalonen IMO,SO 已经足够成熟,回答这样的简单查询不再有价值。这个问题是关于无法提出问题(“我怎样才能只执行一次函数?”虽然公平地说它在标题中得到了很好的体现),而不是关于一个独特的编程问题。
  • 我明白你的意思。如果您认为这不是一个独特的编程问题,请将我们指向一个副本,我们可以继续进行结束投票。我还需要说,我更喜欢将 SO 视为一个不断发展的社区,在这个社区中,新用户被接受以支持 Stackoverflow“教条”。你可能不同意,这没关系。事实上,这就是我们投票的原因,所以这是我认为值得回答的问题的 +1。

标签: javascript jquery


【解决方案1】:

你需要的是.one() 函数。它确保代码只为您触发一次。

文档:http://api.jquery.com/one/

文档示例:

$( "#foo" ).one( "click", function() {
  alert( "This will be displayed only once." );
});

【讨论】:

  • 这似乎是最优雅的解决方案 :) 以前没听说过这个!
【解决方案2】:

编写代码如下:

<script type="text/javascript">
    var popup = '0';

     $(document).ready(function () {     
          $(document).on('click', '.button', function(){
             if(popup == '0') {
                alert('test');
                popup = '1';
             }
          });
     }); 
</script>

一旦你的点击监听器被设置,你之前的 if 语句的位置就不再执行了。只有 on click 函数里面的代码。

或者,您可以取消绑定 onClick 侦听器,而不是设置 popup = '1'。请尝试以下操作:

<script type="text/javascript">
    var popup = '0';

     $(document).ready(function () {     
          $(document).on('click', '.button', function(){
              alert('test');

              //unbinds *all* listeners previously registered on "document"
              $(document).unbind('click');
          });
     }); 
</script>

更清洁,正如 Mathletics 所提到的,从内存中清除不必要的回调。

【讨论】:

  • 首先您可以解决他的解决方案被破坏的原因。然后,您可以提出更好的方法。
  • 这会将处理程序留在内存中,每次都触发,但没有任何效果。解除绑定将完全删除处理程序。
  • 完全同意你的看法。但是为什么不先告诉他他目前的方法有什么问题呢。不管怎样,现在的问题也提出了更好的选择。
  • 我个人并不提倡用同样糟糕的解决方案来修复糟糕的代码。显然,投票表明我既不是孤立的,也不是一致支持的;我们可以同意不同意。
  • 许多提问者会简单地复制+粘贴解决方案,而不了解他们的方法为什么不起作用。我们在这里教学并提供答案。
【解决方案3】:

试试:

<script type="text/javascript">
    var popup = '0';

       $(document).ready(function () {     
            $(document).on('click', '.button', function(){
                if(popup == '0') {
                  alert('test');
                }
                  popup = '1';
            });
       }); 
</script>

您有一个函数将弹出窗口设置为 1,但从未再次检查其值。这样它就会得到检查并且应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2018-07-06
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多