Artykuł ukazał się drukiem w Magazynie INTERNET

Więcej informacji dotyczących sposobów tworzenia stron opartych o DHTML znajdziesz pod adresem: http://www.szewo.com/dhtml.



go to: main / publications /

Obsługa klawiatury w JavaScript


W graficznych systemach operacyjnych głównym urządzeniem, za pomocą którego użytkownik steruje pracą komputera jest myszka. Podczas przeglądania stron internetowych klawiatura jest potrzebna praktycznie tylko do pobrania adresu żądanej witryny. Najnowsze przeglądarki umożliwiają jednakże tworzenie skryptów, które wprowadzają komunikację użytkownika ze stroną WWW za pomocą klawiatury.

Dla wykorzystywania klawiatury w skryptach języka JavaScript niezbędne jest poznanie trzech procedur obsługi zdarzeń.

Procedura onKeyDown

Zdarzenie KeyDown zachodzi, gdy wciśnięty zostaje jakiś klawisz klawiatury. Zdarzenie KeyDown zachodzi zawsze przed zdarzeniem KeyPress.

Procedura onKeyPress

Gdy zostanie naciśnięty klawisz - bezpośrednio po KeyDown - zachodzi zdarzenie KeyPress. W przeciwieństwie do KeyDown, zdarzenie KeyPress nie występuje, gdy zostanie naciśnięty któryś z klawiszy Alt, Ctrl, Shift. Umożliwia to rozpoznawanie kodów znaków, które wymagają naciśnięcia dwóch klawiszy, na przykład wielkich liter.

Procedura onKeyUp

Zdarzenie KeyUp zachodzi, gdy zostaje zwolniony klawisz. Procedura obsługi tego zdarzenia zwraca identyczny kod, jak procedura obsługi zdarzenia KeyDown, zachodzącego odpowiednio wcześniej.

Odczytywanie znaku klawiatury

Wszystkie procedury obsługi zdarzeń związanych z klawiaturą umożliwiają odczytanie kodu znaku, którego dane zdarzenie dotyczy. Przedstawiony niżej skrypt umożliwia odczytanie kodu wciśniętego klawisza:

<SCRIPT LANGUAGE="JavaScript">
<!--
function keyInfo(evnt) {
 if (document.layers) 
  Key = evnt.which;
 if (document.all) 
  Key = event.keyCode;
 alert("Nacisnieto klawisz o kodzie " + Key);
}
document.onkeydown = keyInfo
if (document.layers) document.captureEvents(Event.KeyDown)
//-->
</SCRIPT>

Jak widać odczytywanie znaków w obydwu przeglądarkach przebiega odmiennie - w przeglądarce Netscape'a za pomocą parametru which, Internet Explorer wykorzystuje parametr keyCode. Ponadto, aby w produkcie firmy Netscape rejestrowane były wszystkie wystąpienia zdarzenia KeyDown musimy wykorzystać metodę captureEvents, która jest charakterystyczna dla tej przeglądarki.

W implementacji Internet Explorera obiekt event udostępnia także specjalne parametry shiftKey, altKey i ctrlKey, które umożliwiają odczytanie stanu klawiszy shift, alt oraz ctrl. Parametry te przyjmują wartości true, gdy dany klawisz jest wciśnięty oraz false, gdy klawisz jest zwolniony. Skrypt na stronie, której kod przedstawiono poniżej przedstawia stan tych trzech klawiszy:

<html>
<body>
Stan klawisza SHIFT: <div id=klawiszShift></div>
Stan klawisza ALT: <div id=klawiszAlt></div>
Stan klawisza CTRL: <div id=klawiszCtrl></div>

<script language="JavaScript">
<!--
document.onkeydown=update
document.onkeyup=update

function update() {
 document.all("klawiszShift").innerText=event.shiftKey;
 document.all("klawiszAlt").innerText=event.altKey;
 document.all("klawiszCtrl").innerText=event.ctrlKey;
}
// -->
</script>
</body>
</html>

Funkcja update() odświeża pola strony zawarte pomiędzy znacznikami <div></div> prezentujące stan odpowiednich klawiszy.

Nawigowanie za pomocą klawiatury

Jako pierwszy przykład wykorzystania klawiatury w konstrukcji stron internetowych może posłużyć następujący skrypt:

<script language="JavaScript">
<!--
function navigate(evnt) {
 if ((document.layers)&&(evnt.which==32))
  window.location="http://www.dhtml.pik-net.pl";
 else if ((document.all)&&(event.keyCode==32))
  window.location="http://www.dhtml.pik-net.pl"
}

if (document.layers)
 document.captureEvents(Event.KeyPress)

document.onkeypress=navigate
//-->
</script>

Po naciśnięciu klawisza spacji użytkownikowi oglądającemu stronę, na której zamieszczono powyższy skrypt naciśnięcie klawisza spacji zapewnia przeniesienie pod adres określony parametrem location obiektu window. Rozszerzając ten skrypt o obsługę kolejnych klawiszy możemy skonstruować serwis internetowy z dużą ilością stron, w którym cała nawigacja odbywa się za pomocą klawiatury.

Szersze wykorzystywanie klawiatury

Strony internetowe tworzone z zastosowaniem technik dynamicznych mogą charakteryzować się interakcyjnością, polegająca na przykład na tym, że użytkownik sam decyduje o wyglądzie witryny.
Wprowadźmy na przykład na stronę WWW pojedynczą warstwę.. Naszym zamiarem jest umożliwienie dowolnego pozycjonowania tej warstwy w pionie. W tym celu musimy stworzyć odpowiednie funkcje, które będą odpowiadały za poruszanie elementu strony - w tym przypadku właśnie naszej warstwy (sposoby poruszania elementów witryn internetowych zostały szerzej omówione w numerze 10/99 Magazynu Internet). Skrypt - za pomocą procedur obsługi zdarzeń onKeyDown oraz onKeyUp - będzie reagował na naciskanie i zwalnianie przez użytkownika klawiszy 2 i 8 z klawiatury numerycznej. Nasza warstwa, z którą skojarzono obiekt o nazwie element będzie poruszana tylko w sytuacji, gdy naciśnięto odpowiedni klawisz. Zwolnienie klawisza zatrzymuje ruch. Kod całej strony z omówionym skryptem może przedstawiać się następująco:

<html>
<head>
<script>
function init() {	
 ns4 = (document.layers)? true:false
 ie4 = (document.all)? true:false
 if (ns4) element = document.warstwa
 if (ie4) element = warstwa.style
 element.x = parseInt(element.left)
 element.y = parseInt(element.top)
		
 document.onkeydown = keyDown
 document.onkeyup = keyUp
 if (ns4) document.captureEvents(Event.KeyDown 
    | Event.KeyUp)
}

//funkcja wywolywana, gdy klawisz zostal wcisniety
function keyDown(evnt) {
 if (ns4) var nKey = evnt.which
 if (ie4) var ieKey = window.event.keyCode
 if (nKey==56 || ieKey==104) elementUp()   
 if (nKey==50 || ieKey==98) elementDown()  
}

//funkcja wywolywana, gdy klawisz zostal zwolniony
function keyUp(evnt) {
 if (ns4) var nKey = evnt.which
 if (ie4) var ieKey = window.event.keyCode
 if (nKey==56 || ieKey==104) moveStop()
 if (nKey==50 || ieKey==98) moveStop()
}

//funkcje reazlizujace ruch elementu na stronie www
function elementUp() {
 element.move=true
 moveUp()
}

function elementDown() {
 element.move=true
 moveDown()
}

function moveUp() {
 if (element.move) {
  element.y -= 5
  element.top = element.y
  setTimeout("moveUp()",30)
 }
}

function moveDown() {
 if (element.move) {
  element.y += 5
  element.top = element.y
  setTimeout("moveDown()",30)
 }
}

function moveStop() {
 element.move=false;
}
</script>	
</head>
<body onLoad="init()">
<div id="warstwa" style="position:absolute; left:100; 
 top:100; width:100; height:100; background-color:green;
layer-background-color:green"> </div> </body> </html>
Możliwość reagowania na akcje użytkownika związane z klawiaturą otwiera nowe możliwości przed twórcami stron WWW. Należy jednakże pamiętać, że procedury obsługi zdarzeń związane z klawiaturą są dostępne tylko w nowych przeglądarkach firm Microsoft i Netscape działających w systemie operacyjnym Windows.
Przedstawione w tym artykule metody wykorzystywania skryptów obsługujących klawiaturę są szeroko wykorzystywane przez twórców gier, które są napisane za pomocą języka JavaScript.