製品のドロップダウン リストと、タイプ (教育、ゲーム) とメディア (本、CD) の 2 つのグループのフィルターを含む Web ページがあります。いずれかのフィルターからいつでも選択でき、ドロップダウンは ajax を介してそれに応じてフィルター処理されます。これはすべてうまくいきます。
フィルターを選択すると、ajax が解決されるまで、ドロップダウンの上にスロバーが表示されます。問題は、解決が完了する前にフィルターを複数回変更すると、最初のリクエストでスロバーが削除され、2 番目のリクエストがまだ進行している間にドロップダウンが再び表示されることです。これは私が修正したい小さな問題です。これがJavaScriptです:
$('.radio-filter-type').change(function() {
$("#products-list").hide();
$("#products-throbber").show();
$("#products-container").load(window.location + ' #products-list',
$("#filter-type").serialize() + '&medium=' + $("#filter-media
input[name=medium]:checked").val()
, function () {
$("#products-list").show();
$("#products-throbber").hide();
}
);
});
明らかに、その間にラジオボタンが変更され、最初のボタン.load()
が解決され、リストが表示され、他のボタンが終了する前にスロバーが非表示になります。私はこのようなことができます:
reqCount = 0;
...
.change( ...
reqCount++;
.load( ...
, function () {
reqCount--;
if (!reqCount) { //show list and hide throbber
しかし、Deferred
私はもっときれいな方法が必要だと感じています。現在の遅延スタックにリクエストを追加し、それらがすべて解決されるまで待機する方法はありますか (任意の時点で追加できます)。.load().then()
また、機能していないように見えることにも気付きます。Deferred
まったく使用できます.load()
か?.load()
返却するDOM要素のみ指定できるので便利です。そうでない場合、現在の ajax リクエストを管理し、すべてが一度に完了したときにのみアクションを実行する方法はありますか?