Wyobraźmy sobie zwykłą stronę z kilkoma pozycjami (linkami) w menu: link1, link2, link3. Niech każdy z tych trzech linków powoduje pobranie treści jakiegoś diva (niech to będzie czysty tekst). Po pobraniu odpowiedzi przez przeglądarkę div zostaje wypełniony treścią. Nic nadzywczajnego ;)
A teraz wyobraźmy sobie, że mamy dość wolne łącze lub w danej chwili są problemy z połączeniem, na przykład odebranie odpowiedzi trwa 3 sekundy. Gość kliknął w Link 1 i stwierdził, że się pomylił, bo chodziło mu o Link 2. Natychmiast klika w Link 2 i tak dalej.
Scenariusz wygląda tak:
1. Mamy sobie załadowaną stronę z linkami 1, 2, 3.
2. Gość klika na link 1. Zostaje wysłane Ajaksowe żądanie.
3. Po chwili (np po pół sekundzie) gość klika w link 2.
4. Po kolejnej sekundzie gość klika w link 3.
W "tradycyjnym" klikaniu bez Ajaksa pobieranie linka 1 zostanie wstrzymane w momencie klinięcia w link 2 i tak dalej. A zatem ostatecznie zostanie wysłane żądanie o stronę z linka 3.
Natomiast w advAjaksie wygląda to tak:
5. Po 3 sekundach (takie mamy opóźnienie w połączeniu) od kliknięcia w link 1 do diva zostanie załadowana treść z linka 1.
6. Po pół sekundzie do diva zostanie załadowana treść linka 2.
7. Po kolejnej sekundzie do diva zostanie załadowana treść linka 3.
Przykład: http://mih.boo.pl/advajax-abortowanie/
Aby zasymulować opóźnienie w połączeniu, ustawiłem sleep(3) w trzech skryptach php dających odpowiedź.
Pytanie: jak "wstrzymać" ("abortować" ;) żądanie w advAjax? Można by blokować wszystkie linki do czasu odebrania odpowiedzi, ale nie o taką funkcjonalność chodzi.
EDIT
Głupio tak odpowiadać samemu na swój własny topik ;), ale wymyśliłem pewne obejście.
http://mih.boo.pl/advajax-abortowanie/index2.html
Idea polega na zapisywaniu ostatnio klikniętego linka do zmiennej globalnej:
Kod
var strLastRequestURL = null;
Przy kliknięciu zapisujemy URL:
Kod
strLastRequestURL = new String(strURL);
Następnie w metodzie `onSuccess()' sprawdzamy, czy URL odpowiedzi zgadza się z URL-em ostatniego kliknięcia (musimy uwzglednic uniqid, o ile bylo):
Kod
// Trzeba tak, bo `uniqueParameter' moze byc inny niz "_uniqid".
var strThisRequestURL = new String();
eval('strThisRequestURL = obj.url.replace(/[\\?&]' + obj.uniqueParameter + '=[^&]+/, ""); ');
// Sprawdzamy.
if (strThisRequestURL != strLastRequestURL)
{
// Dostalismy odpowiedz z innego wywolania - nie interesuje nas ona.
return;
}
// Wyswietlamy tresc.
document.getElementById('tresc').innerHTML = obj.responseText;
var strThisRequestURL = new String();
eval('strThisRequestURL = obj.url.replace(/[\\?&]' + obj.uniqueParameter + '=[^&]+/, ""); ');
// Sprawdzamy.
if (strThisRequestURL != strLastRequestURL)
{
// Dostalismy odpowiedz z innego wywolania - nie interesuje nas ona.
return;
}
// Wyswietlamy tresc.
document.getElementById('tresc').innerHTML = obj.responseText;
Trzeba jeszcze przenieść chowanie warstwy "Czekaj" do metody `onSuccess()'.
Nie wiem czy to jest słuszne, bo guru JavaScriptu nie jestem ;o) Proszę o komentarze :)
Nadal jednak nierozwiązana pozostaje kwestia wstrzymywania zbędnego ściągania danych z serwera.