2016-09-27 3 views
1

私は、ユーザのやりとりに応じて時折メニューを再構築するオブジェクトを作成しようとしています。私がやっているやり方は、新しいメニュー項目を複製し、古いメニュー項目を削除することです。つまり、特定のクラスを持つdivの新しいインスタンスを導入するということです。つまり、このクラスに影響を与えるjQueryをリロードする必要があります。jQueryが動作していない同じobjのメソッドを呼び出す

以下の例では、メニュー項目をクリックすると「TypeError:this.objMethodは関数ではありません」という結果になります。

objMethodを呼び出すjQueryClickメソッドを取得するにはどうすればよいですか?私はこれがスコープの問題だと考えていますが、jQuery関数がそれを超えて見えるようにする方法を理解することはできません。

function myObj(){ 
    this.jQueryClick = function(){ 
     $('.menu-item').click(function(){ 
      this.objMethod(); 
     }) 
    } 

    this.objMethod = function(){ 
     alert('hounds released'); 
    } 

    this.jQueryClick(); // will be called whenever the menu is rebuild 
} 

newObj = new myObj; 

私はこのようにjQueryを使って外objMethodを呼び出す場合:

$('.menu-item').click(function(){ 
    newObj.objMethod(); 
}) 

それは動作しますが、それは再構築だときにのみ初期メニューのために働くとしません。 jqueryのために

+1

イベントを動的要素にバインドする方法を学ぶ必要があるようです(['jQuery.on'](http://api.jquery.com/on/)を参照) – Jamiec

+0

あなたが正しいように見えます!私はいつも乱雑に見えると思ったオブジェクト自体にjQueryを統合するよりもはるかにエレガントなソリューションです。ありがとうチャンピオン:o) –

+0

ちょっと涼しい。 probsはありません。申し訳ありませんが、私のコメントは(それを読み返す上で)少し鈍いものでした。 – Jamiec

答えて

-1

あなたはjqueryの経由イベントをバインドするとき

this 

の代わりに

$(this) 

を使用する必要があります。

したがって、.click()メソッドを使用してバインドする場合は、クリックしたオブジェクトのインスタンスを見つけるために$(this)を使用する必要があります。

0

問題はthisのコンテキストがクリックリスナー内で異なることである... VARにthisを保存することにより、スコープを解決してみてください:

var t = this; 

t.jQueryClick = function(){ 
    $('.menu-item').click(function(){ 
     t.objMethod(); 
    }) 
} 

t.objMethod = function(){ 
    alert('hounds released'); 
} 

t.jQueryClick(); 
3

使用$(document).on('click', '.menu-item',callback function)。それの代わりに。再構築時にルートドキュメントオブジェクトからセレクタEverytimeをフェッチします。

関連する問題