jQuery clone()は、on()を使用しても、イベントバインディングを複製しない


100

モバイルWebアプリケーションで使用する一連のカスタムjQueryイベントを作成しました。それらは素晴らしい働きをし、テストされています。しかし、私は理解できない問題がある小さな問題に遭遇しました。

.clone()ボタンを含むDOM内のいくつかの要素を使用しています。ボタンにはいくつかのカスタムイベントがバインドされています(イベントはを使用してバインドされます.on())。残念ながら、jQueryを使用する.clone()と、バインディングが保持されないため、再度追加する必要があります。

誰かが以前にこれに遭遇したことがありますが、誰かが回避策の可能性を知っていますか?使用する.on()ことで、現在または将来存在する要素のバインディングが保持されるはずだと思いましたか?


「.on()を使用すると、現在または将来存在する要素のバインディングが保持されるはずだと思いましたか?」-これはとはほとんど関係ありません.clone。これはjQueryのイベント委譲ロジックであり、追加のセレクターをに渡すと機能し.onます。
pimvdb 2012

回答:


213

この.clone()メソッドのオーバーロードを使用する必要があると思います。

$element.clone(true, true);

clone([withDataAndEvents] [、deepWithDataAndEvents])

withDataAndEvents:要素とともにイベントハンドラとデータをコピーする必要があるかどうかを示すブール値。デフォルト値はfalseです。

deepWithDataAndEvents:複製された要素のすべての子のイベントハンドラーとデータをコピーするかどうかを示すブール値。デフォルトでは、その値は最初の引数の値(デフォルトはfalse)と一致します。


.on()実際にはイベントをターゲットにバインドするのではなく、委任先の要素にバインドすることに注意してください。だからあなたが持っている場合:

$('#container').on('click', '.button', ...);

イベントは実際にはにバインドされてい#containerます。.button要素のクリックが発生すると、#container要素までバブルします。イベントをトリガーした要素は、selectorパラメーターで評価され、.on()一致する場合、イベントハンドラーが実行されます。これがイベント委任の仕組みです。

要素#containerを複製する場合は、保持するために作成されたバインディングのイベントとデータを使用してディープクローンを作成する.on()必要があります。

.on()親で使用している場合、これは必要ありません#container


20
.clone()受け入れられた議論を決して知りませんでした。FML。ご協力いただきありがとうございます。
BenM 2012

1
@DidierGhysおかげで.clone().data()data-xxxx="somedata"DOM内のデータと両方の)のクローンを作成するのに苦労してきました。これも修正されます!
Richard de Wit 2013年

この質問をしましたが、誰も答えませんでした。手伝って頂けますか?
Ali Soltani 2017

すばらしい、私はclick新しい複製されたdivを追加するイベントを作らなければなりませんでした 。ready動作していませんでした
csandreas1

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