Poważny błąd (nie wiem czy jedyny) jest tutaj, w linijce oznaczonej gwiazdką:
Kopiuj
akapit.onmousemove = function(){
pokaz(evt,this); // *
}
Co to jest evt? Zapewne dostajesz błąd "evt is not defined", czy coś takiego. Ten parametr jest Ci jednak potrzebny w funkcji pokaz, ale nie możesz go sobie wziąć z kosmosu.
Okazuje się, że w większości przeglądarek funkcja podstawiona do onmousemove (lub onmouseover, -out itd.) dostaje za darmo pierwszy parametr oznaczający obiekt reprezentujący zdarzenie (np. ruch myszą).
Ty jednak do onmousemove podstawiasz funkcję, która nie interesuje się swoimi parametrami:
Kopiuj
akapit.onmousemove = function() { // lista parametrów jest pusta
pokaz(evt,this);
}
Przeglądarka i tak da funkcji jeden parametr będący obiektem zdarzenia, ale ponieważ zrobiłeś pustą listę argumentów formalnych, nie możesz się dostać do tego zdarzenia przez nazwę.
Dopisz więc jeden argument do listy argumentów tej funkcji, którą podstawiasz do onmousemove. Możesz go nazwać jak chcesz, np. zdarzenie i przekazać go do funkcji pokaz:
Kopiuj
akapit.onmousemove = function(zdarzenie) {
pokaz(zdarzenie, this);
}
Albo możesz nazwać go tak samo jak w funkcji pokaz, czyli evt:
Kopiuj
akapit.onmousemove = function(evt) {
pokaz(evt, this);
}
Chcę po prostu zaznaczyć, że evt to nie jest żadna specjalna nazwa, dlatego na początku sugerowałem nazwać parametr "zdarzenie".
Jeszcze jeden szkopuł: IE nie przekazuje tego parametru. W IE do bieżącego zdarzenia możesz się dostać używając globalnego obiektu window.event (lub po prostu event). Tutaj nazwa ma już znaczenie.
Jak zadowolić zarówno IE, jak i inne przeglądarki? Zanim przekażesz evt do funkcji pokaz, sprawdź czy evt ma wartość prawdziwą. Jeśli będzie obiektem zdarzenia, to będzie miało taką wartość (tak będzie w Firefoksie, Operze, Safari itd.). Jeśli nIE, to znaczy, że jesteśmy w IE, więc musimy podstawić wartość window.event. W sumie:
Kopiuj
akapit.onmousemove = function(evt) {
if (!evt) {
evt = window.event;
}
pokaz(evt, this);
}
Ze względu na fajne własności operatora || możesz to wszystko zapisać tak króciutko (efekt będzie taki sam, jak powyżej):
Kopiuj
akapit.onmousemove = function(evt) {
pokaz(evt || window.event, this);
}
Operator || działa w JavaScripcie tak, że jeśli napiszesz:
...to jeśli A jest prawdziwe (jest obiektem, nie-pustym stringiem, liczbą różną od zera itd.), to zwracane jest A. W przeciwnym wypadku zwracane jest B. Czyli np. mając takie coś:
Kopiuj
function(evt) {
var zdarzenie = evt || window.event; // *
pokaz(zdarzenie);
}
W linijce oznaczonej * prosimy, by do zmiennej zdarzenie podstawić:
a) wartość evt, jeśli wartość ta jest prawdziwa (czyli jeśli evt zostało przekazane funkcji)
b) wartość window.event w przeciwnym wypadku
Wyniku działania operatora || nie trzeba podstawiać do zmiennej, można od razu przekazać do funkcji pokaz, stąd skrócony zapis:
Kopiuj
function(evt) {
pokaz(evt || window.event);
}
Nie mam pojęcia, czy to zadziała bo nie wiem, czy to był jedyny błąd. W razie czego nie płacz ;), tylko odpal konsolę błędów i zobacz komunikaty o błędach JavaScript. W Firefoksie Narzędzia->Konsola błędów, inne przeglądarki też to mają. Najpierw wyczyść konsolę, bo zapewne będzie zapełniona błędami pochodzącymi z różnych stron, które przeglądałeś. Po wyczyszczeniu odśwież swoją stronę -- jeśli wyświetli się jakiś błąd, to przeczytaj komunikat i zrób co trzeba.