代码之家  ›  专栏  ›  技术社区  ›  Michael Stum

只在事件中注册一次函数?

  •  2
  • Michael Stum  · 技术社区  · 15 年前

    我有一个jquery插件,需要注册一个click事件处理程序:

    $.fn.myPlugin = function (options) {
        var settings = {
            // snipped
        };
        $.extend(settings, options || {});
    
        $("body").click(function () {
          // Do Something
        });
    
        // Rest of the plugin
    });
    

    问题是多个调用多次注册函数。由于函数需要保持附加状态,因此无法使用.one()。

    如果函数已附加,是否有方法?我能给它取个名字吗?还是必须使用闭包魔法设置一些布尔标记?

    3 回复  |  直到 15 年前
        1
  •  3
  •   John Strickler    15 年前

    为事件命名。

    $('body').unbind('click.myPlugin').bind('click.myPlugin', function() {
       ..code...
    });
    

    More on Namespaced Events .

        2
  •  1
  •   lonesomeday    15 年前

    一个具有良好性能的非常简单的方法是在 body 元素:

    if (!$.data(document.body, 'myPluginRegistered') {
        $.data(document.body, 'myPluginRegistered', true);
    
        // do your plugin code here
    }
    
        3
  •  0
  •   Community Mohan Dere    9 年前

    最简单的可能是你建议的布尔加闭包魔法。或者,您可以获取绑定到“click”对象的所有函数的列表,并查看您附加的函数是否已经存在。

    这个问题显示了如何获取列表。

    List all javascript events wired up on a page using jquery

    不过,在我第一次响应之后出现的名称空间建议可能更简单。