2

私がこれから尋ねようとしていることが可能かどうか、または物事について正しいやり方であるかどうかはわかりませんが、ここに行きます。

AJAXを使用してサーバーからデータをロードし、それを視覚的に表示するWebページがあります。ユーザーは、ページ上の2つのボタンのいずれかを使用して、週でフィルタリングされたデータを「スクロール」するオプションがあります。これらのボタンのコードは次のようなものです。

$("#leftButton").click(function () {
    clearCurrentlyDisplayedData();
    changeFilter(1);   //Or -1, or whatever.
    loadAndDisplayData();
}

この(簡略化された)例では、loadAndDisplayData()はAJAX呼び出しを使用してこのデータをフェッチし、リクエストの完了時に次のように表示します。

$.get(
    "web/service/address", 
    function (data, textStatus, jqXHR) {
     //Display the data here
});

ただし、ユーザーが矢印をクリックしてデータをすばやくスクロールしすぎると、問題が発生します。ボタンを2回続けてすばやくクリックすると、2週間分のデータが重なり合って表示されます。

データが収集されるまでボタンを無効にしたくありません。データの収集と表示には少し時間がかかるため、ユーザーがサイト内をすばやく移動できなくなり、すぐにイライラすることになります。

2セットのデータのロードを防ぐために、ユーザーがボタンの1つをクリックしたときに、現在実行中のスクリプトまたはAJAX呼び出し(またはこれらの結果として呼び出される関数)を強制終了することは可能ですか?この問題を解決する方法は他にありますか?

4

2 に答える 2

3

jqXHRオブジェクトにはabort()メソッドがあり、このメソッドを呼び出してAJAXリクエストをキャンセルできます。

ただし、これには、によって返されるオブジェクトへの参照を保持する必要があります$.get()

おそらくより簡単なアプローチは、要求を行うときにグローバルカウンターをインクリメントし、要求が完了するとそれをデクリメントすることです。successハンドラーで、カウンターの場合にのみ結果を表示します(=== 0たとえば、保留中の要求がない場合)。

于 2012-07-09T13:58:59.193 に答える
1

この問題を解決する方法は他にありますか?

リクエストを中止するよりも、データをクリアして新しいデータを単一の操作として表示する方法でコールバック関数を内部に構築する方がよい場合があり$.getます。つまり、新しいデータの準備ができるまでデータをクリアしません。

Javascriptは一度に1つのイベント/スレッドのみを処理するため、各AJAX応答は到着時にシリアルに処理されます。

于 2012-07-09T14:03:02.077 に答える