Powiedzmy, że mam metodę javascript, która zajmuje trochę czasu, aby zakończyć, bez jakichkolwiek opinii użytkowników. W moim przypadku sortowanie wierszy w elemencie tabeli (wszystko w DOM, zajmuje tylko zbyt długo, jeśli istnieje lot wierszy), ale może zrobić wszystko. Chcę wyświetlać kursor "postępu" podczas działania. Oto, co mam obecnie, ale wypróbowałem także kilka innych rzeczy:Zmiana typu kursora dla dokumentu html z javascript
// SORT
document.body.style.cursor = "progress";
MyLongRunningMethod(); //blocks for 10-15 seconds before returning
document.body.style.cursor = "auto";
Niestety nic się nie dzieje. MyLongRunningMethod() robi to poprawnie, ale kursor nigdy się nie zmienia. Uważam, że przeglądarka musi czekać na powrót metody, aby móc obsłużyć komunikat zmiany kursora wygenerowany przez środowisko okienkowania, ale może to być odstąpienie, a nawet jeśli to prawda, nie wiem jak to naprawić.
Jakieś inne pomysły?
[edytuj]: Uznałem, że cały back-story, który miałem, nie był naprawdę potrzebny. Jeśli naprawdę chcesz to przeczytać, sprawdź historię zmian.
Wyniki końcowe
skończyło się za pomocą roztworu RoBorg użytkownika. Nie psuje kodu tak bardzo jak początkowo myślałem, ponieważ mogę zadeklarować funkcję w tym miejscu - to tylko jak dodanie wbudowanego bloku zakresu.
Co ciekawe, w Firefoksie odkryłem, że oznacza to, że wcale nie muszę zmieniać kursora. Zauważyłem, że po dodaniu wywołania setTimeout czasami widziałem wskaźnik oczekiwania, zanim ustawiono kursor postępu, więc skomentowałem swój kod kursora. Okazuje się, że coś w użyciu setTimeout do wypchnięcia tego z obsługi zdarzeń kliknięcia pozwala FireFoxowi na samodzielne zorientowanie się, że kursor powinien się zmienić. Niestety, IE nie jest tak inteligentny, więc przywróciłem kod kursora.
To daje wiarę mojej wierze, że zmiana kursora jest odpowiednią akcją tutaj — biorąc pod uwagę możliwość, że tak czy inaczej będzie robić przeglądarka. Naprawdę nie chcę dodawać i usuwać nowych elementów (takich jak zajęty obraz jakiegoś typu) do DOM dla strony, o której wiem bardzo mało. Skrypt powinien pasować niezależnie od tego, jaki projekt wizualny używa strona.
Wreszcie, Chrome nie ma znaczenia. Korzystając z tych samych danych, Chrome zajmuje mniej niż 5 sekund, co pozwoliło na wykonanie IE i Firefoksa od 10 do 15 sekund. Więc ich silnik javascript jest naprawdę szybszy. Nie mogę się doczekać silnika Firefox 3.1. Niestety ludzie tutaj nadal używają głównie IE6.
Czy funkcja SortTable wywołuje serwer asynchronicznie? – kristina
Nie, robi to wszystko na kliencie z DOM. –
Innymi słowy: blokuje do zakończenia. Widzę to w firebug. –