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

Nelson と alex は、FlyingCat が求めていたことを誤解しているに違いないと思います...
one() メソッドは、登録されたハンドラーが 1 回だけ呼び出されることを確認できます
が、開発者が one() メソッドを複数回呼び出すと (FlyingCat のシナリオのように) 、

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

登録された各ハンドラーは、クリックすると一度呼び出されるため、問題はまだ解決されていません。
Kolink の答えは正しく、マイナーな変更を加える必要があります。

于 2012-11-28T02:07:38.060 に答える
0

最も簡単な方法は、新しいオブジェクトをアタッチする前に、objectchild のクリック機能の以前のアタッチメントを確実に削除することです。他のアプローチもありますが、コードはより膨大になります。

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 に答える
0

試す:

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

http://jsfiddle.net/zYGhz/

于 2012-11-28T00:41:48.650 に答える