6

オブジェクトが関数の場合、クロージャー(var self = this)でこれを実行できることはわかっています...

<a href="#" id="x">click here</a>

<script type="text/javascript">
    var object = {
        y : 1,

        handle_click : function (e) {
            alert('handling click');

            //want to access y here

            return false;
        },

        load : function () {
            document.getElementById('x').onclick = this.handle_click;
        }
    };

    object.load();
</script>
4

4 に答える 4

3

したがって、イベントハンドラー部分は問題なく接続されますが(私は自分でテストしました)、コメントが示すように、定義したオブジェクトの「y」プロパティにアクセスできません。

これは機能します:

var object = { 
  y : 1, 
  handle_click : function (e) {
    alert('handling click');

    //want to access y here 
    alert(this.y); 

    return false; 
  }, 
  load : function () { 
    var that = this; 
    document.getElementById('x').onclick = function(e) {
      that.handle_click(e); // pass-through the event object
    }; 
  } 
}; 
object.load();

これを行う方法は他にもありますが、これは機能します。

于 2008-11-20T17:32:43.627 に答える
3

呼び出しを定義されているオブジェクトにバインドする最も簡単な方法は、handle_click次のようになります。

        var self=this;
        document.getElementById('x').onclick = 
           function(e) { return self.handle_click(e) };

パラメーターを渡す必要がある場合、またはコードをきれいに見せたい場合 (たとえば、類似のイベント ハンドラーを多数設定している場合) は、カリー化手法を使用して同じことを実現できます。

bind : function(fn)
{
   var self = this;
   // copy arguments into local array
   var args = Array.prototype.slice.call(arguments, 0); 
   // returned function replaces first argument with event arg,
   // calls fn with composite arguments
   return function(e) { args[0] = e; return fn.apply(self, args); };
},

...

        document.getElementById('x').onclick = this.bind(this.handle_click, 
           "this parameter is passed to handle_click()",
           "as is this one");
于 2008-11-20T17:53:12.197 に答える
0

Jasonの最新のものでそれを行う方法がわかります。匿名関数なしでそれを行う方法はありますか?

于 2008-11-20T18:39:22.573 に答える
0

AddEventListener のおかげでハンドラー メソッドを使用してオブジェクトを直接渡すことができ、その属性にアクセスできます: http://www.thecssninja.com/javascript/handleevent

これが、私のように、数年後にこのトピックを探す人の助けになることを願っています!

于 2013-12-26T10:22:51.577 に答える