4
function myClass(myobject){
      var myclass = {};

      myclass.registerEvent = function(){
          $('#'+myobject.id).live('someEventThatTriggersRightAway', runMe);
      };

      runMe = function(){
            $('#'+myobject.id).die('someEventThatTriggersRightAway', runMe);
            console.log("Hello "+myobject.name);
      };

      return myclass;
}


var instance1 = new myClass({id:'button1',name:'MATO'});
var instance2 = new myClass({id:'button2',name:'YAMA'});

このコードを実行すると

instance1.registerEvent();

結果は

Hello YAMA

これは、最初のインスタンスが2番目のインスタンスによって上書きされたかのようです。イベントのコールバックで「myobject」を渡すことができればこれを解決できますが、その方法がわかりません。また、パラメータがある場合は強制終了できません。これどうやってするの?

ありがとうございました!

4

2 に答える 2

2

varfromを逃したrunMeためrunMe、グローバル実行コンテキストにリークしています。したがって、 を呼び出すたびに、 inmyClassへの参照が変更されます。myobjectrunMe

var runMe = function(){
    $('#'+myobject.id).die('someEventThatTriggersRightAway', runMe);
    console.log("Hello "+myobject.name);
};

これが実際のです。


補足: jQuery.live().die()メソッドが廃止されたことをご存知ですか? .on()(jQuery 1.7+) または.delegate()代わりに使用する必要があります。

于 2012-09-13T07:13:07.360 に答える
1

以下の回答は純粋に理論的なものです。.live().die()は非推奨であるため、今後は使用しないでください。コードを最新の状態にするには、以下の.live()/呼び出しを次のように置き換えます。.die()

// for .live()
$(document).on('click', '#'+myobject.id, myobject, runMe);

// for .die()
$(document).off('click', '#'+e.data.id, runMe);

ここでdocumentは、ボタンの最も近い静的な親要素に置き換えることができ、また置き換える必要があります。新しいコードのデモ


ドキュメントに よると、 data はメソッドのオプションの 2 番目のパラメーターであり、 event object.live()を介してアクセスします。次のように使用します。

function myClass(myobject){
      var myclass = {};

      myclass.registerEvent = function(){
          $('#'+myobject.id).live('click', myobject, runMe);
      };

      var runMe = function(e){
          $('#'+e.data.id).die('click', runMe);
          console.log("Hello "+e.data.name);
      };

      return myclass;
}

var instance1 = new myClass({id:'button1',name:'MATO'});
var instance2 = new myClass({id:'button2',name:'YAMA'});

instance1.registerEvent();
instance2.registerEvent();

古いコードの動作デモ

于 2012-09-13T07:24:42.530 に答える