![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 83 Pomógł: 0 Dołączył: 31.03.2002 Skąd: Toruń Ostrzeżenie: (0%) ![]() ![]() |
Witam :) Ostatnio zacząłem poznawać advAjax i napotkałem taki problem. A piszę o tym tutaj, bo nie bardzo wiem jak szukać.
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; 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. Ten post edytował msulik 20.05.2006, 20:35:58 -------------------- misiu | chór
"Zdeterminowany programista potrafi stworzyć fatalny kod w każdym języku" Allen Holub |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 05:14 |