2012-01-10 35 views
5

jqueryを使用して新しく追加された要素に関数をバインドしようとしています...私は数多くの例をオンラインで試しましたが、何とか何も役に立ちません。私はidとボタンを持つフォームを作成し、submit ajaxは別のページから要素をロードし、HTMLを現在のWebサイトに挿入します。すべて正常に動作するようですが、新しくロードされた要素にはイベントがバインドされていません。動的に追加された要素にイベントをバインドする

<form id="tclick" method="post" action="${tg.url('/entryCmd')}"> 
    <input type="hidden" name="id" value="${entries[0].id}" /> 
    <input type="submit" value="submit"/> 
</form> 

とjQuery:

$("#tclick").on("submit", function(data){ 
    var h = $(this).serialize(); 
    var d; 

    $.get($(this).attr("action"), h, 
     function(returnData) { 
      d = returnData; 
     } 
    ); 

    $(this).ajaxStop(function(){ 
     $(this).after($(d).find(".edit-content").html()); 
    }); 

    return false; 
}); 

編集コンテンツのdivは、右のフォーム要素の後にロードされます。ここ はhtmlです。いくつかの要素があり、jQuery関数にバインドされている必要があります。

+1

代わりに.on() –

+1

の)(.liveしてみてくださいhttp://api.jquery.com/live/ – Yoshi

+1

@ジャックオールトレード。とにかく彼は.live()を使用していません –

答えて

1

ページロード後にDOMに追加される要素にイベントを追加するには、delegate()を使用するか、jQuery 1.7+ on()を使用する必要があります。

$(".edit-content").delegate("#myDiv", "click", function() { 
    // do stuff when #myDiv gets clicked. 
}); 

API:
Delegate
On

+0

私はonを使用していますが、何とかそれは私のためには機能しません...私は間違っていますか? :/ – Alko

4

ガット基本的に2つのオプションがこれを行うには:あなたのイベントバインド

  1. を新しいHTML付加した後:

    $(this).ajaxStop(function(){ 
        $(this).after($(d).find(".edit-content").html()); 
        // do you binding here 
    }); 
    
  2. を210
  3. イベント委譲を使用します(.on()または.delegate())。

    $('.some-container').on('click', '.edit-button', function(e) {...}); 
    

    これは、DOMにすでにあったか、またはその後にロードされ、後者の問題ではない、クラス.editボタンを持つ子供のための要素.some-コンテナにクリックイベントを委任します。ジャックすべての取引 `live`がon`の、参照の`の賛成で廃止されました@

+0

私はこれを試しましたが、on関数の'eded-button 'パラメータを置くと、サイトが更新されます。削除すると、要素は更新されずに読み込まれます。 – Alko

+0

正直なところ私は理解していない。 .on()のためにページがどのようにリフレッシュされるのか分かりません。変更されたコードで質問を編集して、より大きな画像を表示できますか? –

+0

OK、今は#tclickだけで使用していましたが、すべてのイベントを(click()、function(){...})に変更して再バインドしました。 jqueryの仕組み、チュートリアルだけの学習...ある日、jqueryに関する本を読むべきです:P – Alko