Każdy jest innym i nikt sobą samym.

Tym razem jednak zmienna change ustawiona jest na false, więc wywoływany jest kod z wierszy 19 do 31:
if (document.layers) {
x2 = ev.screenX;
y2 = ev.screenY;
document.releaseEvents(Event.MOUSEMOVE);
}
else {
x2 = event.screenX;
y2 = event.screenY;
document.onmousemove = null;
}
window.status = 'Początek: (' + x1 + ',' + y1 +
') Koniec: (' + x2 + ',' + y2 + ') Odległość: ' +
(Math.abs((x2 - x1) + (y2 - y1))) + ' pikseli';
Zmienne x1 i y1 zawierają współrzędne pierwszego kliknięcia, a nowe zmienne, x2 i y2, ustawiane są na współrzędne kliknięcia drugiego. Nie trzeba już obsługiwać zdarzenia onmousemove, więc w przypadku Netscape Navigatora wywoływana jest metoda releaseEvents()– ustawiając document.onmousemove na wartość null.
Pozostaje jeszcze tylko wyświetlić odległość między początkowym a końcowym punktem. Pamiętasz wzór na odległość? Odpowiedni wzór w wierszach 29–31.14
Teraz zostaje nam jeszcze tylko zająć się zdarzeniem onkeypress. Należy przypomnieć, że document. onkeypress miało wywoływać funkcję keepKeys(). Oto sama keepKeys() z wierszy 49–58:
function keepKeys(ev) {
if (document.layers) {
keys += String.fromCharCode(ev.which);
window.status = 'Wciśnięty klawisz: ' + String.fromCharCode(ev.which);
}
else {
keys += String.fromCharCode(event.keyCode);
window.status = 'Wciśnięty klawisz: ' + String.fromCharCode(event.keyCode);
}
}
Używając tej samej techniki rozpoznawania przeglądarki ciąg pusty ustawiamy jako wartość zmiennej keys oraz napis odpowiadający wciśniętemu klawiszowi. Robimy to, stosując – niezależnie od
użytej przeglądarki –
String.fromCharCode(). Jednak w JavaScripcie 1.2 klawiszom odpowiadają znaki ISO Latin-1, a JScript używa standardu Unicode. Liczba dla JavaScriptu przechowywana jest we właściwości which obiektu event. Liczba dla JScriptu znajduje się we właściwości event.keyCode. Użytkownik wciska zatem ciąg klawiszy, a następnie wybiera przycisk Pokaż klawisze. Funkcja zgłasza komunikat podający wartość keys, po czym znów tę zmienną zeruje.
frames.js Zastosowania praktyczne: Wymuszanie ładowania w ramkach.

14Jest to odległość w „metryce miasto” – o czym wiedzą ci, którzy mieli kiedyś styczność z topologią. W ramach ćwiczenia proponuję poprawić funkcję tak, aby wyliczała prawdziwą odległość między punktami ( przyp. tłum.).
131 Rozdział 6 - Realizacja plików źródłowych JavaScriptu
Wymagana wersja:
JavaScript 1.1.
Funkcje:
keepIn(), keepOut()
Ten plik zawiera tylko dwie funkcje. Jedna zatrzymuje dokumenty w danym zestawie ramek, druga natomiast trzyma je od ramek z daleka. Aby kod z pliku frames.js mógł zadziałać, wymaga użycia wielu plików HTML. Spróbujemy na przykład załadować do przeglądarki plik ch06\frameset. html. Plik ten zawiera dwie ramki – w jednej z nich znajduje się plik frames.html, który z kolei używa frames.js w celu zapewnienia, że frames.html zawsze zostanie załadowany na górze. Dlatego właśnie załadowanie frameset.html daje komunikat o błędzie (do przeglądarki ładowany jest w końcu frames.html). 15
Słów parę o konkurujących modelach zdarzeń
Modele zdarzeń w Netscape Navigatorze 4 i Internet Explorerze 4 mają pewne cechy
wspólne, i całe szczęście. Nadal istnieją jednak między nimi znaczące różnice, z których
może najważniejszą jest to, że o ile zdarzenia Netscape Navigatora przesuwają się w dół
hierarchii (na przykład z window do frame, następnie do document, dalej do form i w końcu do field), to w Internet Explorerze zdarzenia pączkują do góry (na przykład z field do form do document do frame do window). Więcej wiadomości o obu modelach znajdziesz pod podanym niżej adresem URL. Informacje te są niesłychanie istotne, jeśli za-
mierzasz stosować złożoną, działającą w różnych przeglądarkach, obsługę zdarzeń.
Aby dowiedzieć się więcej o Netscape Navigatorze, odwiedź stronę:
http://developer.netscape.com/docs/manuals/communicator/jsguiede4/evnt.htm
Aby uzyskać więcej o Internet Explorerze, zajrzyj na stronę:
http://msdn.microsoft.com/developer/sdk/inetsdk/help/dhtml/doc_object/event_model.htm
#dom_event
Jeśli chcemy z kolei upewnić się, że nasz dokument nie zostanie załadowany inaczej niż do wskazanych ramek, też użyj frames.js. Rysunek 6.10 przedstawia, co się stało, kiedy próbowano załadować ch06\frames2.html. Rezultatem jest komunikat o błędzie, informujący, że naruszono zasady użycia ramek, a następnie przeglądarka ładuje odpowiedni zestaw zawierający frames2.html, co widać na rysunku 6.11.
Kod realizujący wszystkie te funkcje jest krótki i przyjemny. Funkcja keepOut() porównuje adres URL dokumentu z górnego okienka z adresem URL bieżącej ramki. Jeśli właściwości location. href nie pasują do siebie, keepOut() protestuje i ładuje dokument we własnym górnym oknie. Funkcja keepIn() dokonuje porównania dokładnie przeciwne i ładuje adres URL z przekazanego argumentu, jeśli porównanie zawiedzie. Plik frames.js pokazano jako przykład 6.6.
Przykład 6.6. frames.js
1 function keepIn(parentHREF) {
2 if (top.location.href == self.location.href) {