Neočekávané chování při stisku dvou kláves současně rubrika: Programování: JavaScript

5 stirl021
položil/-a 17.8.2015

Mám jednoduchý skript pro nácvik psaní všemi deseti, viz http://jsfiddle.net/stirl021/m5an8gn7/4/

Pokud uživatel při psaní udělá chybu, zobrazí se znak, který má správně stisknout. Po opravě (tzn. stiskne klávesu se znakem, ve kterém udělal chybu), znak zmizí a pokračuje v psaní. Problém je, že když se při opravě stisknou dvě chybné klávesy současně (nebo velmi rychle po sobě), zobrazený chybný znak zmizí, přitom by měl na obrazovce zůstat, protože nebyla zmáčknuta správná klávesa.

Např. text k přepisu je "zkouška psaní". Uživatel napíše "zkou" a pak udělá chybu a stiskne "č" (správně má být "š" ). Zobrazí se tedy písmeno "š". Teď uživatel stiskne dvě jiné špatné dvě klávesy a písmeno "š" zmizí. Přitom by mělo na obrazovce zůstat, protože nebyla zmáčknuta správná klávesa ("š").

Nedaří se mi zjistit, čím to je.

Díky za nápady.

odkaz Vyřešeno
9 Občan
odpověděl/-a 19.8.2015

Chyba je určitě v použití keyup i keydown zároveň. V checkWriting chybí parametr event, odkud čteš proud nových znaků. V checkWring pak použiješ pokud event.keyCode != ocekavanePismeno, tak 1) tak stornuješ event 2) inkrementuješ error count 3) Potřebuješ vypsat chybné písmeno, takže potřebuješ proměnou s celkovým počtem napsaných písmen (včetně ošetření del, backspace). Celkově takto nepotřebuješ zneužívat textareu, jako proměnou a můžeš držet View část oddělenou. To používaní View, jako modelu, pokud dáš pryč, tak to logicky odstraní i ostatní chyby.

Komentáře

  • stirl021 : Díky. Postupoval jsem podle Tvojí rady a problém vyřešen - http://jsfiddle.net/stirl021/m5an8gn7/8/. Keyup, který není case sensitive jsem ještě nahradil keypress a funguje vše tak jak má. Sice zatím nechápu, co přesně se dělo při keyup a keydown, ale s tím si pohraju. Co znamená "používání view jako modelu" tuším jenom mlhavě, na to ještě nemám naskillováno :-) 20.8.2015
  • Občan : Jednoduše. DOM není úložiště dat, ale vstup/výstup. Z inputů a textarea by se mělo číst při eventu -- provést program -- a na konci případně zase do nich něco zapsat. Čte se ihned u eventu. Input a textarea svádí ke čtení a zapisování uprostřed programu, ovšem od toho jsou proměné. Důvod je mimo jíné i čistě praktický, čitelnost. Takže momentálně checkWriting na začátku hezky čte vstup, to je OK. Potom by měl následovat proces volání bloků, který pracují pouze s proměnýma a na konci checkWriting by mělo být třeba funkce renderAll, která teprve provede projekci do View, tedy takové ty .textContent = "xx", .html(neco). 21.8.2015

Pro zobrazení všech 4 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.