Autor Zpráva
SpotRudloff
Profil
Zdravím Vás,
mám problém najít jak udělat v JS funkci, která když zdetekuje zmáčknutí klávesy na klávesnici, tak zavolá určitý sektor kódu.
Myslím to tak, že např. po stisknutí klávesy W se zavolá funkce, kterou nastavým.
Mohl by mi někdo poradit?

Děkuju
Witiko
Profil
Napojte si na objekt window onkeydown event a pak odchytněte danou klávesu:

if(!window.addEventListener) {
  window.addEventListener = function (type, listener, useCapture) {
    document.body.attachEvent('on' + type, listener);
  }
}

function chytej(e) {
  if(!e) e = window.event;
  if(e.keyCode == 87) {
    alert("Už tě mám!");
    e.returnValue = false;
    return false;
  } else {
    return true;
  }
}

window.addEventListener("keydown", chytej, false);


Případně jednoduše:

document.body.onkeydown = function(e) {
  if(!e) e = window.event;
  if(e.keyCode == 87) {
    alert("Už tě mám!");
    e.returnValue = false;
    return false;
  } else {
    return true;
  }
}

pokud víte, že nebudete chtít napojovat na onkeydown event window / document.body další funkce.
SpotRudloff
Profil
Moc děkuju za odpověď.
SpotRudloff
Profil
A nevíte někdo, jak udělat aby to detekovalo, že klávesu držím dole?
DJ Miky
Profil
Událost onkeydown se zavolá při stisknutí klávesy, událost onkeyup při jejím uvolnění. Můžeš si třeba při stisknutí nastavit nějakou proměnnou na true a při uvolnění na false.
SpotRudloff
Profil
Díky, funguje mi to.
Chamurappi
Profil
Reaguji na DJ Mikyho:
Jen doplním, že u některých kláves (např. kurzorových) to v některých prohlížečích nemusí platit, událost onkeydown může být vyvolávána i při držení klávesy.
SpotRudloff
Profil
Chamurappi:
Děkuju za informaci. :)
Misha
Profil *
Mám na webu fotogalerii a chci v ní použít posun mezi fotografiemi pomocí kurzorových kláves (šipky vlevo a vpravo). Výše zveřejněný script mi funguje s klávesou W, ale jakmile dám kód klávesy 109 (šipka vpravo) tak to neudělá nic. Neví někdo v čem je problém?

Testuji to na Mozille, přičemž takovéto posunování mezi fotografiemi mi na jiných webech funguje (rajče apod.)
Witiko
Profil
Šipka vpravo je kód klávesy #39.
Pro určení kódu klávesy můžeš použít můj jednoduchý listener, který mám stranou vedle své hry hada.
Nebo samozřejmě za pomoci kódu vlastního:

document.body.onkeydown = function(e) {
  if(!e) e = window.event;
  if(e.keyCode) {
    alert(e.keyCode);
    e.returnValue = false;
    return false;
  } else {
    return true;
  }
}

Je tu i problematika s rozdílem keyCode eventu navráceného onkeypress a onkeydown eventem, doporučuji k pozornosti tento článek.
Misha
Profil *
Witiko:
Díky moc, našel jsem na webu tabulku znaků a tam byla šipka pod jiným číslem. #39 mi již funguje.

Ještě mě napadá, na mém webu mám pod každou fotkou také formulář pro komentáře. Takže když někdo píše komentář a chce posunout kurzor o pár znaků dopředu, nebo dozadu, tak se automaticky přesměruje stránka na další (předchozí) fotku. Tím pádem uživatel příjde o psaný komentář. Bylo by možné nějakým způsobem zajistit aby se akce neprovedla pokud je kurzor ve formulářovém poli?
Witiko
Profil
No, řešil bych to buď nějak takto (neozkoušeno):
/* do globální proměnné element bude uložena reference na dané textové pole */
var element = document.getElementById('...');

document.body.onkeydown = function(e) {
  if(!e) e = window.event;
  if(e.target != element && e.srcElement != element) {
    if(e.keyCode == 37) {
      /* Doleva akce */
      e.returnValue = false;
      return false;
    } else if(e.keyCode == 39) {
      /* Doprava akce */
      e.returnValue = false;
      return false;
    } else {
      /* Jiné tlačítko */
      return true;
    }
  } else {
    /* Je označený element */
    return true;
  }
}

Nebo bych jednoduše event nabalil na span uvnitř něhož by se daná textarea nenalézala.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0