2017-01-19 13 views
2

少し問題があります。私はオブジェクト内にいくつかの要素を作成しましたが、うまくいきます。しかし、今は私のオブジェクトの内部で関数を実行するためにいくつかのEventListenersを追加したいのですが、問題は "setSelection"という関数を実行できないことです。 (「this」はオブジェクトの「this」ではなく、クリック機能内のイベントの「this」です)。jQueryオブジェクト指向のDOM要素を作成し、イベントリスナーを追加

function Object() { 
    this.init = function() { 
     // delete table 
     // ... 
     // set table 
     $('tr').append('<td id="1">test</td>'); 

     $('td').click(function() { 
      // execute setSelection 
     }); 
    } 

    this.setSelection = function(x) { 
     alert('You clicked id ' + x); 
    } 
} 

$(document).ready(function() { 
    x = new Object(); 
    x.init(); 
}); 
+0

「Object」関数をオーバーライドする上で問題が発生する可能性があります。あなたがやっていることがわかっていれば、名前を変更する必要があります。問題の原因は、イベントコールバックがグローバルコンテキストで実行されることです。これが提案された答えが働く理由です。あなたはvarにコンテキストを格納するか、コンテキストを返すために 'bind'、' apply'などの関数を使う必要があります – Kaddath

答えて

1

あなたはclickイベントハンドラで使用できる変数に外側のスコープでthisの参照を格納することによってこの問題を解決することができます

function Object() { 
    var _this = this; 

    this.init = function() { 
     // delete table 
     // ... 
     // set table 
     $('tr').append('<td id="1">test</td>'); 

     $('td').click(function() { 
      _this.doSomething(); 
     }); 
    } 

    this.setSelection = function(x) { 
     alert('You clicked id ' + x); 
    } 
} 
1
$('td').click((function(e) { 
     // execute setSelection 
     this.setSelection(...); 
    }).bind(this)); 
+0

これはうまくいくでしょうが、必要に応じてクリックされた 'td'への参照を取得するために' e.target'を使います。 –

0

私のアプローチは次のようになります。

function Object() { 
    this.init = function() { 
    // delete table 
    // ... 
    // set table 
    $('tr').append('<td id="1">test</td>'); 

    $('td').click(function() { 
     setSelection(this); 
    }); 
    } 

    setSelection = function(x) { 
    alert('You clicked id ' + x); 
    } 
} 
0

私はこの問題を解決しました...

function Object() { 
    this.init = function() { 
     // delete table 
     // ... 
     // set table 
     $('tr').append('<td id="1">test</td>'); 

     this.setSelection(); 
    } 

    this.setSelection = function() { 
     $('td').click(function() { 
      alert('You clicked id ' + $(this).attr('id')); 
     }); 
    } 
} 

$(document).ready(function() { 
    x = new Object(); 
    x.init(); 
}); 
+1

これはあなたの質問に対する解決策ではありません。そして、これは間違っています。 'setSelection'を呼び出すたびに、新しい' click'ハンドラが 'td'要素に追加されます。これらのハンドラは、次にクリックするたびに順番に実行されます。 – Igor

関連する問題