2009-03-12 11 views
5

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.

+0

Czy funkcja SortTable wywołuje serwer asynchronicznie? – kristina

+0

Nie, robi to wszystko na kliencie z DOM. –

+0

Innymi słowy: blokuje do zakończenia. Widzę to w firebug. –

Odpowiedz

9

Czy używasz stopera poza pytaniem?

document.body.style.cursor = "progress"; 

setTimeout(function() 
{ 
    SortTable(cell.cellIndex, dir, sortType); 
    document.body.style.cursor = "auto"; 
}, 10); 
+0

Z pewnością nie jest to idealne, ale nie mam innego wyjścia :( –

+0

Skończyłem na tej trasie, a oto co znalazłem Nie muszę ustawiać kursora Dodając w tym miejscu setTimeout(), przeglądarka domyśla się, że musi zaktualizować kursor na swoim - jest w stanie wykryć, że funkcja używa dużo procesora –

+0

Nieważne: to był tylko firefox, IE nie jest taki mądry i Chrome kończy wystarczająco szybko, że nie Potrzebuję tego i tak –

0

Spróbuj usunąć document.body.style.cursor = "auto" i umieścić go w funkcji wywoływanej przy zakończeniu funkcji SortTable. W ten sposób zatrzymasz ruchliwy kursor, dopóki funkcja nie zostanie zakończona. Upewnij się, że jeśli osiągniesz warunek błędu w SortTable(), że nadal uderzyłeś w wywołanie funkcji "Już nie zajęte".

+0

Myślę, że źle odczytałeś co się dzieje Blokada funkcji SortTable –

+0

Tak, zdecydowanie to przegapiłem Widzę to teraz i chociaż wygląda na to, że odpowiedź brzmi "Nie rób tego", Naprawdę zastanawiam się, co się tutaj dzieje. Wygląda na to, że strona nie zadaje sobie trudu, aby wyświetlić jakiekolwiek zmiany w stylu, gdy skrypt jest w toku (próbowałem zmienić na niebieskie tło) – user64640

2

W Internecie zmiana kursora myszy nie jest konwencjonalna i nie jest przyjemna.

Znacznie lepiej (i łatwiej) używać niewielkich animacji na samej stronie, sprawdź http://www.ajaxload.info/ dla takich obrazów (to generator online).

+0

Niezły link: dostaniesz upv Uwaga na to później, ale wstrzymuję się w tej chwili, więc pytanie pozostaje dłużej bez odpowiedzi. –

+0

Zgadzam się, że zmiana kursora jest zła dla żądania ajax. Jednak wszystko to w DOM i może potencjalnie zużywać dużo czasu procesora. Zmiana kursora jest tradycyjnym sposobem wskazywania go za pomocą dowolnej aplikacji. Również: kursor postępu! = Kursor oczekiwania. –

+0

To zależy. Zmiana na wskaźnik jest przyjemna i konwencjonalna. –