次のように機能する jQM アプリ (1.3.2) に折りたたみ可能なものを統合したいと考えています。
- 折りたたまれ始めます。
- クリックすると、サーバーから折りたたみ可能なリストアイテムの取得が開始されます。折りたたみ式は閉じたままです。ロード アイコンが回転している可能性があります。
- すべての要素が読み込まれ、リストビューが更新されて準備が整うと、折りたたみ可能なものが展開されます。
- もう一度クリックすると、すぐに閉じて、1 から始まります。
私の最初のアイデアは、expand
イベントを取得してその伝播を防ぐことでした。読み込みが完了したら、カスタム イベント ハンドラーの登録を解除して折りたたみ可能なものを通常に戻し、最後に JavaScript から展開イベントをトリガーして開きます。
問題は、これが最初のラウンドで機能することですが、その後折りたたみ式がとにかく開きます。この例を考えてみましょう (これもjsfiddleにあります):
<div data-role="collapsible" id="c">
<h2>Collapse</h2>
<ul data-role="listview" id="lv">
<li>You don't see me!</li>
</ul>
</div>
<a href="#" data-role="button" onClick="$('#c').off('expand', stop)">
Unlock the collapsible
</a>
<a href="#" data-role="button" onClick="$('#c').on('expand', stop)">
Lock the collapsible
</a>
JavaScript:
var stop = function(event) {
alert('Locked!');
event.preventDefault();
}
// executed after the element is created ...
$('#c').on('expand', stop)
ここで、ロード後に折りたたみ可能をクリックすると、閉じたままになります (良い)。ロック解除をクリックすると開き、アラートは表示されません (良い)。もう一度ロックすると、アラートが表示されますが (良い)、とにかく開きます (悪い)。
誰かが私が間違っていることを教えてくれますか? ロック解除による目に見えない副作用があるようです。ここにはいくつかの同様の質問がありますが、ほとんどの人は、拡張を再開せずに拡張を防止するだけで満足しています.
だから私の質問は次のとおりです。折りたたみ式の拡張を確実に遅らせる最良の方法は何ですか?
編集:リストビューロジックを統合し、このエラーも表示する別の例を追加しました。jsFiddle はこちらです。.one()
また、登録解除をより追跡可能にするために移動しました。
新しい JavaScript:
var stop_n_load = function (event) {
alert('stop opening! (or at least try to ...)');
// try to stop the expanding by stopping the event
event.preventDefault();
// Do some work that takes time and trigger expand afterwards ...
setTimeout(function (e) {
dd = new Date();
$('#lv').empty();
$('#lv').append("<li><a href='#'>Item A ("+dd+")</a></li>");
$('#lv').append("<li><a href='#'>Item B ("+dd+")</a></li>");
$('#lv').listview('refresh');
// when done, start expanding without this handler (was register only once)
$('#c').trigger('expand');
// for the next collapse register stop_n_load again
$('#c').one('collapse', reset);
}, 2000);
};
var reset = function (event) {
$('#c').one('expand', stop_n_load);
};
$('#c').one('expand', stop_n_load);
最初の拡張では期待どおりに動作し、最初に更新してから開きます。2 回目の実行では、待機せずに開きます。後でタイムスタンプが更新されるのを確認できるため、イベントが適切に呼び出されます。
.preventDefault()
わからないという問題があるようです...