これは、複数のイベント トリガーの問題としても知られており、jQuery Mobile のアーキテクチャーから一般的です。
この問題にはいくつかの解決策があります。
解決策 1
最善の解決策はpageinit
、イベントをバインドするために使用することです。公式ドキュメントを見ると、pageinit
ドキュメントの準備ができたのと同じように、一度だけトリガーされることがわかります。そのため、イベントが再度バインドされることはありません。off メソッドでイベントを削除する場合のような処理オーバーヘッドがないため、これが最適なソリューションです。
動作中の jsFiddle の例: http://jsfiddle.net/Gajotres/AAFH8/
この実用的なソリューションは、以前の問題のある例に基づいて作成されています。
解決策 2
バインドする前にイベントを削除します。
$(document).on('pagebeforeshow', '#index', function(){
$(document).off('click', '#test-button').on('click', '#test-button',function(e) {
alert('Button click');
});
});
動作中の jsFiddle の例: http://jsfiddle.net/Gajotres/K8YmG/
解決策 3
次のように、jQuery フィルター セレクターを使用します。
$('#carousel div:Event(!click)').each(function(){
//If click is not bind to #carousel div do something
});
イベント フィルターは公式の jQuery フレームワークの一部ではないため、http: //www.codenothing.com/archives/2009/event-filter/で見つけることができます 。
簡単に言えば、速度が主な関心事である場合、ソリューション 2はソリューション 1 よりもはるかに優れています。
解決策 4
新しいもの、おそらくそれらすべての中で最も簡単です。
$(document).on('pagebeforeshow', '#index', function(){
$(document).on('click', '#test-button',function(e) {
if(e.handled !== true) // This will prevent event triggering more then once
{
alert('Clicked');
e.handled = true;
}
});
});
動作中の jsFiddle の例: http://jsfiddle.net/Gajotres/Yev9/
実際の例はここにあります。
もう 1 つ、jQuery Mobile で準備されたドキュメントを使用しないでください。代わりに、適切なページ イベントを使用してください。最善の解決策は、一度だけトリガーする pageinit を使用することです。詳細については、こちらを参照してください。