Forum dyskusyjne poświęcone zagadnieniom związanym z językami JavaScript, VBScript i podobnym
14 lipca 2005, o 22:06
Dlaczego napis nie ukazuje się tuż po kliknięciu? MSIE nie uaktualnia ekranu i w ogóle nie reaguje na to co się na nim dzieje, dopóki nie zakończy aktualnie wykonywanej funkcji (nawet nie zmienia kursora np. nad linkami). Dlaczego? Powiedzmy, że by reagował. Kliknięcie wywołuje zdarzenie onclick - trzeba je obsłużyc. A więc co wykonywać: funkcję, czy obsługę zdarzenia? Jeśli obsługę, to zmiana tekstu na stronie wywoła całą lawinę kolejnych zdarzeń itd... Dlatego wszystko jest wykonywane po kolei.
Jeśli np. masz dwie instrukcje jedna po drugiej:
window.document.body.style.background='#ff0000'
window.document.body.style.background='#ffff00'
to tło strony nie mignie na czerwono. Najpierw zostanie podstawiona wartość #ff0000, następnie wartość #ffff00, a dopiero po zakończeniu całej funkcji ekran będzie zaktualizowany "za jednym zamachem" do bieżącej wartości (zrobi się od razu żółty).
Jeśli więc masz chodzącą w kółko zamkniętą pętlę, to Explorer "nie patrzy" wtedy na nic innego - dopóki nie skończy. Wyjątkiem jest wywołanie okienka alert(), które powoduje uaktualnienie ekranu w momencie jego wyświetlenia i chwilowe zatrzymanie funkcji.
W takiej sytuacji używa się sztuczki, o której wspomniał Dexter: konstruuje się funkcję w taki sposób, aby po wykonaniu iluś obiegów zapisywała wyniki i kończyła się wywołaniem jej dalszego ciągu metodą setTimeout() z minimalnym czasem np. 1ms. Po takim chwilowym zakończeniu funkcji Explorer uaktualni ekran i na chwilę "rzuci na niego okiem". Jeśli wtedy zajdzie zdarzenie (np. onclick) będzie obsłużone. Niemal natychmiast setTimeout() wywoła funkcję ponownie. Ta odczyta zapisane uprzednio wartości i będzie kontynuowała od miejsca przerwania. W efekcie cała pętla wykona się "na raty", z przerwami.
A co do Twojego pierwszego pytania, to ani w JavaScript, ani w VBScript nie ma DoEvent. Można natomiast programowo kliknąć dowolny element strony lub wywołać dowolne inne zdarzenie na stronie - ale to nie zmieni faktu, że ekran zostanie uaktualniony dopiero po zakończeniu bieżąco wykonywanej funkcji. Można także wywołać kod jakiegoś błędu i przechwycić go programowo, co w efekcie przerwie funkcję (a np. wywoła inną). Ale wszelkie działania programowe niczego nie zmieniają w zakresie "czułości" czekającego na naciśnięcie guzika. Czy Explorer będzie wykonywał taką czy inną funkcję i tak nie będzie "patrzył" na ekran, dopóki nie zakończy. Pozostaje więc setTimeout() co jednak potrafi dość znacząco wydłużyć wykonywanie dużych pętli.
Pozdrawiam
Paweł Rajewski
14 lipca 2005, o 22:36
Muszę przyznać jedną rzecz. Dlaczego przezornie moją domyślną przeglądarką w Pajączku jest IE
Ano dlatego, że kilka razy zdarzyło mi się zawalić jakiś pierdółek, co doprowadzało do nieskończonej pętli – system zamiera
O ile w IE wystarczy odczekać 30 sekund, to Mozilla pieprzy się do usranej
@Wydra707: Jak ustawić IE tak, by czekał tylko 10 sekund