jquery .on()送信イベント


98

に問題があり.on()ます。複数のフォーム要素(のあるフォームclass="remember")があり、form.rememberAJAXを使用して別のフォーム要素も追加しています。したがって、次のような送信イベントを処理する必要があります。

$('form.remember').on('submit',function(){...}) 

ただし、AJAXで追加されたフォームは機能しません。

問題はどこだ?バグですか?


9
試してみる$(document).on('submit','form.remember',function(){...})
セルジオ

1
@Sergio documentは最も近い静的な親に置き換えます。
Mark Ba​​ijens

回答:


216

イベントをドキュメントレベルに委任する必要があります

$(document).on('submit','form.remember',function(){
   // code
});

$('form.remember').on('submit'と同じよう$('form.remember').submit(に機能しますが、使用すると$(document).on('submit','form.remember'、後で追加されるDOMでも機能します。


24
また、$(document).onに比べてパフォーマンスがはるかに低いことも覚えておいてください$('form.remember').on('submit'。これで、ドキュメント内のすべての送信イベントをリッスンする必要があります。on document可能であれば、listenよりもスコープを少し制限する方がはるかに良い
Liam

7
$( 'body')。on( 'submit'、 'form.remember'、function(){//コード}); 私の問題を解決しました
Olotin Temitope 2017年

@Liamは正しいですが、$(document).onは、ajaxでレンダリングされた要素に対するCRUD操作にも役立ちます。
Norielle Cruz

38

同じ症状で問題が発生しました。私の場合、送信機能に「return」ステートメントがないことがわかりました。

例えば:

 $("#id_form").on("submit", function(){
   //Code: Action (like ajax...)
   return false;
 })

2
return false;フォームを送信しないことに注意してください。フォームを送信するには、を使用してくださいreturn true;
Kai Noack

0

ここでの問題は、「オン」が同時に存在するすべての要素に適用されることです。要素を動的に作成する場合は、再度onを実行する必要があります。

$('form').on('submit',doFormStuff);

createNewForm();

// re-attach to all forms
$('form').off('submit').on('submit',doFormStuff);

フォームには通常名前またはIDがあるため、新しいフォームに添付することもできます。動的なものをたくさん作成している場合は、セットアップまたはバインド関数を含めます。

function bindItems(){
    $('form').off('submit').on('submit',doFormStuff); 
    $('button').off('click').on('click',doButtonStuff);
}   

そのため、何かを作成するときはいつも(私の場合はボタン)、bindItemsを呼び出してページ上のすべてを更新します。

createNewButton();
bindItems();

'body'やdocument要素を使うのは好きではありません。タブやモーダルを使うと、ぶらぶらして予期しないことをする傾向があるからです。シンプルな1ページのプロジェクトでない限り、常にできるだけ具体的にするようにしています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.