绑定事件只有一次

fir*_*ird 102 jquery

我有以下代码:

function someMethod()
{
  $(obj).click(function {});
}
Run Code Online (Sandbox Code Playgroud)

someMethod被调用两次,因此click事件被绑定两次.怎么才能让它只绑定一次?

pna*_*pna 184

如果你可以应用它,可能想看一下event.preventDefaultevent.stopPropagation 或者unbind和bind,每次都在你的方法中

function someMethod()
{
  $(obj).off('click').on('click', function(e) {
    // put your logic in here 
  });
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你不想意外取消绑定其他点击事件,你可能想要使用`function someMethod(){$(obj).off('click.namespace').on('click.namespace',function {}) ; }` (24认同)
  • 要小心,因为这会取消所有点击事件的绑定,并不总是需要的行为.例如,当您将某些内容绑定到文档时,您只想取消绑定一个事件,而不是所有事件. (17认同)

Iai*_*ain 86

除了pna的答案之外,您可能希望考虑命名空间事件,这样您就不会意外地解除所有点击事件的绑定.

function someMethod() {
    $(obj).unbind('click.namespace').bind('click.namespace', function() { });
}

http://docs.jquery.com/Namespaced_Events

  • 这应该是公认的答案.解除绑定*所有*点击事件可能会轻易破坏 - 特别是如果它是一个包含大量jQuery的复杂项目.感谢那!不知道这个简单的命名空间解决方案!! (9认同)

Mat*_*ton 19

没有内置方法来确定您是否已绑定此特定函数.您可以将多个单击函数绑定到对象.例如:

$('#id').bind('click', function(){
alert('hello');
});


$('#id').bind('click', function(){
alert('goodbuy');
});
Run Code Online (Sandbox Code Playgroud)

如果你在单击对象时执行上述操作,它将提示你好,然后再见.要确保只有一个函数绑定到click事件,取消绑定click事件处理程序,然后绑定所需的函数,如下所示:

$(obj).unbind('click').bind('click', function(){... });
Run Code Online (Sandbox Code Playgroud)


jfr*_*d00 12

显而易见的解决方案是不要someMethod()两次打电话.如果你无法修复它,那么你可以保留一个状态变量,所以它只能像这样绑定一次:

function someMethod()
{
    if (!someMethod.bound) {
        $(obj).click(function() {});
        someMethod.bound = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:这使用函数本身的属性,而不是引入一个全局变量来跟踪它是否已被绑定.您还可以在对象本身上使用属性.

你可以在这里看到它的工作:http://jsfiddle.net/jfriend00/VHkxu/.


小智 12

或者使用jQuery的one()函数,它类似于on(),但只触发一次事件,即使你多次绑定它.

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

  • 有时它有帮助.但有时候你想要的解决方案就是你可以使用:但只能使用很多. (6认同)

Esa*_*ija 5

jQuery只调用一次函数很容易:

function someMethod()
{

     $(obj).click(function() {});
      this.someMethod = $.noop;
}
Run Code Online (Sandbox Code Playgroud)


nat*_*olt 5

您可以使用这个 jQuery 扩展功能。

$.fn.once = function (type, fn, uid) {
  if(uid == undefined) {
    console.error("Called $.once without uid\n", this, "\n", fn);
  }

  var dataStr = type+"-handler-"+uid;
  if(!this.data(dataStr)) {
    this.data(dataStr, true);
    this.on(type, fn);
  }
};
Run Code Online (Sandbox Code Playgroud)

而不是这样做

$("button").on("click", function(){
  alert("You Clicked On A Button");
});
Run Code Online (Sandbox Code Playgroud)

雅这样做

$("button").once("click", function(){
  alert("You Clicked On A Button");
}, "btnHandler");
Run Code Online (Sandbox Code Playgroud)

现在当我有一个围绕它的函数时

function addBtnHandler() {
  $("button").once("click", function() {
    alert("You Clicked On A Button");
  }, "btnHandler");
}
Run Code Online (Sandbox Code Playgroud)

我多次调用它

addBtnHandler();
addBtnHandler();
addBtnHandler();
Run Code Online (Sandbox Code Playgroud)

它只执行一次。

请注意,该扩展通过检查 uid 和类型来工作。这意味着您可以使用相同的 uid 绑定不同类型的处理程序,您可能需要也可能不需要。要更改它,请编辑。

var dataStr = type+"-handler-"+uid;

与类似的东西

var dataStr = "handler-"+uid;