1

我正在尝试在我的项目中向我的元素注册一次点击事件。

我简化了我的代码,基本上我的结构如下所示:

function objectParent(){

}

objectParent.prototype.click=function()(

   $('#create').click(function(){
     var var1=new objectchild();
         var1.add();
   })

}

function objectchild(){

}

objectchild.prototype.add=function()(

  //The '#aButton' click event will be registered 4 times if the '#create' button is clicked 4 times.
  //so the alert will pop 4 times when 'aButton' is clicked which is not what I wanted.

  //I can use $('#aButton').unbind('click') to remove the click event but I have many buttons in my project
  //and I want to have better solution for this.

  $('#aButton').click(function(){
     alert('click')
   })

}

var test=new objectParent()
    test.click();

html

<a id='create' href='#'>test</a>

//everytime this <a> is clicked, it will create a new objectchild object 
//after click 4 times of this button and click 'aButton', it will pop the alert box 4 times
//I know it register click event 4 times to the 'aButton' 
//I only want to pop the alert box once.

//I can use $('#aButton').unbind('click); to remove the click event but I have many many buttons in my codes
//ex bButton, cButton...etc. I want to have a better approach for my codes.

<a id='aButton' href='#'>button</a>

我希望我能很好地解释我的问题。谢谢您的帮助!

4

4 回答 4

7

做就是了:

$('#aButton').one('click', function(){
     alert('click')
});
于 2012-11-28T00:41:47.510 回答
0

尝试:

var clickHandler = function(event) {
  $('#element').unbind('click', clickHandler);
  ...
} 
$('#element').on('click', clickHandler);

http://jsfiddle.net/zYGhz/

于 2012-11-28T00:41:48.650 回答
0

我认为 Nelson & alex 一定误解了 FlyingCat 的要求......
one() 方法只能确保注册的处理程序只被调用一次,
但是如果开发人员多次调用 one() 方法(就像在 FlyingCat 的场景中一样) ,

 for (var i = 0; i < 3; i++) {
     $("#element").one(function() {
          alert(1);
     })
 }

单击时每个注册的处理程序将被调用一次,因此问题仍未解决。
Kolink 的答案是正确的,您必须进行细微的更改。

于 2012-11-28T02:07:38.060 回答
0

到目前为止,最简单的方法是确保在附加新的之前删除 objectchild 的 click 函数的任何先前附件。还有其他方法,但代码会更多。

objectchild.prototype.add = function(){
    $('#aButton').off('click.x').on('click.x'function(){
        alert('click');
    });
};

.x用于命名事件。这允许.off('click.x')在不影响可能已附加在代码中其他位置的其他点击处理程序的情况下进行操作。如果没有附加其他点击处理程序,则命名空间不是绝对必要的,但它没有害处。

您可能想要.x用更有意义的东西替换。

于 2012-11-28T03:26:28.047 回答