ugrás a tartalomhoz

JavaScript billentyű események

whiteman0524 · 2009. Aug. 22. (Szo), 13.23
Üdv mindenkinek !

Először írok itt a weblabor oldalán, és ezért még nem igen vágom hogy mi hol van, meg hogy jó helyen vagyok-e egyáltalán, szóval ha rossz helyre írok esetleg vagy nem megfelelően akkor előre is elnézést kérek :-)

Tehát elhatároztam hogy csinálni szeretnék egy "mesterséges" textarea elemet, mégpedig egy szimpla div elem segítségével. Arra gondoltam hogy ha ez a div elem aktív, akkor figyelem a billentyű eseményeket és megjelenítem benne ami kell. Namost ugye vannak speciális karakterek amikhez módosítóbillentyűk kellenek mint például az Alt, vagy a Shift. Tudom hogy ezt is lehet figyelni, de nekem sehogy se akar összejönni sajnos :-( Őszintén szólva nagyon örülnék egy komplett példának, ha valaki esetleg szánna rá egy kis időt. A feladat tehát csak annyi lenne hogy egy div elemhez fűzzük hozzá mindig a leütött billentyűt(ez még megy), de kezelje a módosító billentyűket is(ez már nem megy), továbbá működjön nagyjából minden böngészőben (Firefox és Explorer legújabb verziói elegendőek).

A segítséget előre is köszönöm szépem.
 
1

javascript keretrendszer

s_volenszki · 2009. Aug. 22. (Szo), 14.33
Szerintem ismerkedj meg egy javascript keretrendszerrel (én a jQuery-t ajánlom), azzal biztos egyszerűbb lesz!

Egy hivatkozás kapaszkodónak: http://docs.jquery.com/Events/keydown#fn
2

Módosító billentyűk

Poetro · 2009. Aug. 22. (Szo), 15.22
Önmagában a módosító billentyűk leütését nem tudod elkapni JavaScript segítségével, csak azt, hogy le volt-e nyomva valamely "normál" gomb lenyomása közben. Például a Ctrl+Enter esetében tudhatod, hogy le volt nyomva a Ctrl gomb is, de azt nem fogod tudni figyelni hogy a Ctrl gombot lenyomták-e. Ugyanez érvényes a Shift és az Alt gombokra is.
Valamint azt se fogod tudni JavaScripttel elkapni, hogy a kettő közül melyik Ctrl, Shift vagy Alt gomb volt lenyomva a "normál" gomb lenyomásakor, csak azt hogy le volt nyomva.

Mindenesetre álljon itt egy részlet a jQuery-t használó HTMLBox Drupal modulból:

    $(idoc).keypress = function (e) {
      switch ((e.which) ? e.which : e.keyCode) {
        case 13: // ENTER
          if (!$.browser.opera && !e.ctrlKey && !e.shiftKey) {
            try {
              var el = ta.getEventElement(iframe.contentWindow, e);
              if (el.nodeName == "BODY") {
                glob_ha[d.id].cmd("formatblock", "<p>");
              }
            }
            catch (exception) {}
          }
          break;
        case 61: // =
          if (e.ctrlKey) {
            if (e.shiftKey) {
              glob_ha[d.id].cmd("superscript");
            }
            else {
              glob_ha[d.id].cmd("subscript");
            }
          }
          break;
        case 66: // B
          if (e.ctrlKey && !e.shiftKey) {
            glob_ha[d.id].cmd("bold");
          }
          break;
        case 73: // I
          if (e.ctrlKey && !e.shiftKey) {
            glob_ha[d.id].cmd("italic");
          }
          break;
        case 74: // J
          if (e.ctrlKey && !e.shiftKey) {
            glob_ha[d.id].cmd("unlink");
          }
          break;
        case 75: // K
          if (e.ctrlKey && !e.shiftKey) {
            glob_ha[d.id].cmd("createlink");
          }
          break;
        case 85: // U
          if (e.ctrlKey && !e.shiftKey) {
            glob_ha[d.id].cmd("italic");
          }
          break;
        default:
          break;
      }
    };
3

Óhhh...Mindent lehet figyelni...

whiteman0524 · 2009. Aug. 22. (Szo), 17.14
...Csak kreatívnak kell lenni :D Íme az alábbi kód, tökéletesen működik mind Explorer 8-ban mind a legújabb Mozillában(a visszamenő kompatibilitás kérdését most hagyjuk). Még csak a Shift-re van felkészítve, valamint csak 0-tól 9-ig írja jól a dolgokat. A többi karakternek a kódját adja vissza. A beépített String.fromCharCode() függvényt meg jobb lesz elfelejteni mert az mindet csinál csak nem a megfelelő karaktereket adja vissza. Sajnos ha igazán jó megoldást akarunk, és teljesen magyar billentyűzetre optimalizáltat, akkor magunknak kell definiálni a fromCharCode() függvényt (amit alább az atalakit fügvénnyel reprezentáltam).
window.onload = function(){
	document.onkeydown = hozzaad;
}

function hozzaad(e){
	if (!e) var e = window.event;
	var karakter = e.keyCode;
	
	// Még csak a Shift-re van felkészítve. Annak a kódja (a böngésző szerint a 16-os)
	// ugye ha őt nyomjuk le akkor nem akarunk semmit se hozzáfűzni a szövegdobozhoz. Ilyen módon
	// akármilyen lista készíthető a "lenyomtuk de ne történjen semmi" - faja gombokról.
	
	if (karakter != 16){ 
		karakter = atalakit(e, karakter);
		var szoveg_kontener = document.getElementById('szoveg_kontener');
		szoveg_kontener.innerHTML += karakter;
	}
}
function atalakit(e, karakter){
	if (!e) var e = window.event;
	
	// Megfelelünk a "szabványkövető", és a makacs böngészőnek is.
	
	if (karakter == 48){
		karakter = ((e.modifiers & Event.SHIFT_MASK == true) || (e.shiftKey == true)) ? '§' : '0';
	} else if (karakter == 49){
		karakter = ((e.modifiers & Event.SHIFT_MASK == true) || (e.shiftKey == true)) ? '\'' : '1';
	} else if (karakter == 50){
		karakter = ((e.modifiers & Event.SHIFT_MASK == true) || (e.shiftKey == true)) ? '"' : '2';
	} else if (karakter == 51){
		karakter = ((e.modifiers & Event.SHIFT_MASK == true) || (e.shiftKey == true)) ? '+' : '3';
	} else if (karakter == 52){
		karakter = ((e.modifiers & Event.SHIFT_MASK == true) || (e.shiftKey == true)) ? '!' : '4';
	} else if (karakter == 53){
		karakter = ((e.modifiers & Event.SHIFT_MASK == true) || (e.shiftKey == true)) ? '%' : '5';
	} else if (karakter == 54){
		karakter = ((e.modifiers & Event.SHIFT_MASK == true) || (e.shiftKey == true)) ? '/' : '6';
	} else if (karakter == 55){
		karakter = ((e.modifiers & Event.SHIFT_MASK == true) || (e.shiftKey == true)) ? '=' : '7';
	} else if (karakter == 56){
		karakter = ((e.modifiers & Event.SHIFT_MASK == true) || (e.shiftKey == true)) ? '(' : '8';
	} else if (karakter == 57){
		karakter = ((e.modifiers & Event.SHIFT_MASK == true) || (e.shiftKey == true)) ? ')' : '9';
	}
	
	return karakter;
}
Lehet, hogy csúnya megoldás, és minden bizonnyal van még mit szépíteni rajta. De működik és ez a lényeg :-) Ezzel a módszerrel az egyedüli baj csak az, hogy sajnos a különböző böngészőkben különbözőek a gyors gombok. És például a a Mozillában a Shift + 1 -re előugrik valami gyorskeresés, ezáltal elveszi a fókuszt az aktuális mezőtől, amibe írunk. Továbbá egyes karakterek kódjait másképpen adják vissza a böngészők. Például az ó - karakterét. De az operának az ö, ü és az ó se tetszik :-)
5

Igaz

Poetro · 2009. Aug. 22. (Szo), 18.58
Igaz, a Shift kódja 16, a Ctrl kódja 17 és az Alté 18.
4

És mire kell ez neked? Mert

rrd · 2009. Aug. 22. (Szo), 17.54
És mire kell ez neked? Mert ha esetleg egy kis szövegszerkesztőt akarsz összerakni akkor arra vannak kész megoldások mint a tinymce
6

Igen

whiteman0524 · 2009. Aug. 22. (Szo), 19.45
Egy kis szövegszerkesztőt akarok csinálni. És olyat, ami a végleges, tehát átalakított formában jeleníti meg a beírt dolgokat. Ezt akarom összehozni. Természetesen ha nem lenne JavaScript, akkor egy sima textarea elem jelenne meg annak a div elemnek a helyén amibe amúgy írkálnék. Szóval ez csak egy plusz fícsör lenne, és teljesen diszkrét. Szóval lényegében valami MSN félét akarok csinálni, ahol egyből látni leht milyen lesz. Nem kell előnézet gomb meg hasonló cuccok.

Igen, amúgy tudom hogy vannak már megoldások. Szinte mindenre van. De én sose copyzok. Sőt még ötletet se "lopok" csak ha nagyon szakad a kötél :-) Általában mindent magamtól találok ki. Elkezdem valahonnan, és fejlesztem tovább, amíg teljesen profi nem lesz, vagy a lehető legjobb (mármint lehető legjobb megoldás). De azért csinálom mert élvezem hogy meg kell oldani egy problémát, és nem szeretek már meglévő kódokat használni :-)
7

Nah működik...

whiteman0524 · 2009. Aug. 23. (V), 00.00
Egyedül az Ű-betűről kellett lemondani sajnos. Arra nem adnak külön kódot a böngészők, hanem az Ü kódját adják. Szóval azt nem lehet sajnos megkülönböztetni. De annyi baj legyen..Még belefér :) Viszont van egy nagyon idegesítő probléma. A Gyors gombok. Valakinek nincs ötlete arra, hogy hogyan lehetne azt megoldani, hogy ha mondjuk Mozillában Shift + 1 -et ütök, akkor ne ugorjon elő a gyorskereső, vagy hogy ha Operában egy - jelet nyomok, akkor ne kicsinyítse le a képet ? (stb..stb..) :D Hát igen. Mert nem csak az eseménykezelő figyeli a kombinációkat meg a lenyomott billentyűket, hanem a böngésző is sajnos. Valahogy át kéne adni a fókuszt annak a div elemnek, de úgy ahogy egy textarea elem funkcionál. Szóval ha aktív, akkor ne érzékeljék a gyorsbillentyűket a böngészők. De sajnos nincs ötletem erre...Hátha valakinek van :)
8

return false?

Ustak · 2009. Aug. 23. (V), 10.06
vagy

        event.preventDefault( );
        event.stopPropagation( );
Üdv:
Gábor
9

Ööö....

whiteman0524 · 2009. Aug. 23. (V), 16.11
A return false az oké..De az csak arra jó, hogy például az F5-öt meg a Backspace-t illetve néhány más gombot letiltsunk. De a Mozillában a Shift + 1 - re továbbra is előugrik a gyorskeresés [hivatkozások], vagy a Shift + 6 -ra a sima gyorskeresés. A Ctrl + F ről nem is beszélve. De ugyan ez a helyzet a többi böngészővel is sajnos. Továbbá az Operában a - jelre kicsinyíti a megjelenített weblapot, ami azért gáz, mert ha kötőjelet akar valaki írni, akkor egyben le is kicsinyíti a lapot, ami mondanom se kell hogy mennyire zavaró. Szóval szerintem a böngésző beállításait nem lehet JavaScripttel felülbírálni ilyen módon. Ebből sajnos azt a következtetést kell hogy levonjam, hogy a billentyű események figyelése a fenti feladat szempontjából nem fog célra vezetni. A gyorsgombok miatt halálra van ítélve, mert a kettő együtt összeakad, és felhasználói szempontból szinte használhatatlan. Továbbá a magyar ékezetes betűk kódjait eltérően adják vissza a böngészők, ami jelenleg nem annyira probléma (mert kipróbáltam és nem akadnak össze), de sajnos az Ű - betűről így is le kell mondani mert arra nem adnak külön kódot. Szóval az Ü - ként fog megjelenni. Tehát ide más megoldás kell szerintem.

Őszintén szólva nem tudom hogy mit csinálnak a fent írt kódjaid nevezetesen :
   1. event.preventDefault( );  
   2. event.stopPropagation( );  
Kipróbáltam (bár lehet rosszul alkalmaztam) és nem működtek sajnos. A gyorsgombok továbbra is élnek. A lényeg az lenne hogy azokat kéne letiltani.
10

biztos igazad van

Ustak · 2009. Aug. 23. (V), 16.32
valójában nincs most lehetőségem kipróbálni a fentieket, emlékeszem hogy pár éve írtam valami tigramenüre egy billentyűzet kezelhetőséget, mely f8 ra hozta talán a menüt és a nyilakkal lehetett lépkedni fel le almenükbe jobbra balra. Igazából azon is el kellene gondolkozni, hogy miért érdemes letiltani a billentyűket, melyeket a böngésző használója már megszokott, hogy ott és akkor és úgy működnek ahogy. Pl a ctrl+f. Nincs elég kombináció szabadon :-)

Ez a cikk hátha segít:
preventing event default behavior
bár ez elég régi böngészőkről szól, és biztos a mozilla developer center oldalán is találsz hasonlót :-)
Üdv:
Gábor.
11

Keresés

Max Logan · 2009. Aug. 23. (V), 18.02
Nem beszélve arról, hogy nekem úgy van beállítva a Firefox, hogy nem kell CTRL + F-et nyomnom. Ha gépelni kezdek, akkor egyéből keresi az oldalon ...
12

Hát igen...

whiteman0524 · 2009. Aug. 23. (V), 22.23
Természetesen ha lehetne tiltani az ilyen gyors gombokat, akkor csak akkor tiltanám ha a szövegmező fókuszban lenne, hogy addig ne zavarhassanak. Nyilván, ha valaki kommentet ír például, akkor nincsen szüksége a Ctrl + F -re, vagy az F5 -re, vagy a kicsinyítésre - nagyításra, gyors keresésre stb. :) Szóval csak akkor venné el a gyors gombokat a script, ha aktívvá válna a szövegmező. Inaktivitás esetén természetesen élne az összes funkció. Nem kívánom én megnehezíteni egy felhasználó dolgát sem. Én legfőképpen felhasználói szempontból közelítem meg a dolgokat. Hogy minél hatékonyabban és gyorsabban lehessen használni valamit amellett, hogy a jól bevált szokásokon lehetőleg ne változtassak túl sokat, hogy nehogy eltévelyedjen a kedves user :)
13

Még egy kis probléma

whiteman0524 · 2009. Aug. 26. (Sze), 23.47
Nem tudja valaki véletlenül hogy ha inaktívvá teszünk egy szövegmezőt, és utánna megint átadjuk neki a fókuszt, akkor hogy lehet a kulzor helyét megőrizni ? Kicsit érhetőbben : Van egy szövegmezőm. Van fölötte egy gomb. Ha megnyomom a gombot, akkor előugrik egy menü, ezáltal a szövegmezőtől elveszi a fókuszt. Ha a menüben kattintok valamire, akkor valamit beszúr a szövegmezőbe majd a szövegmezőobjektum.focus(); -al visszadja neki a fókuszt, de sajnos a kurzor a szövegmező legvégére kerül. Ezt hogy lehetne kiküszöbölni ? Tehát hogy maradjon ott ahol akkor volt, amikor meghívtam a menüt.

Továbbá még egy idegesítő probléma. Ha nagyobb kommentet írok, ami már nem fér bele a szövegmezőbe, akkor ugye gördül. Ha mondjuk a végén vagyok, tehát legörgettem teljesen, és valamit beszúrok a szövegmezőbe - mondjuk egy szmájlit - akkor a beszúrás után visszaugrik a szövegmező legelejére. Ezt is ki szeretném küszöbölni valahogy.

A segítséget előre is köszönöm.
14

Kurzor

Poetro · 2009. Aug. 27. (Cs), 00.00
Ugyan semennyiben nem tartozik az eredeti témához, de kérdezd le a kurzor pozícióját a (blur), akkor mentsd el a kurzor pozícióját, és fókusz esetén pedig visszarakod a kurzort oda, ahol volt. Pont mint a hozzászólás szerkesztőben itt.
15

Értem..ezt nem tudtam

whiteman0524 · 2009. Aug. 27. (Cs), 15.55
Köszönöm a segítséget. És valóban nem sok köze van a billentyűeseményekhez, szóval bocs a rossz helyen föltett kérdésért.
16

Új megközelítés.

Zserigta · 2010. Már. 29. (H), 19.35
Lehet már elavult ez a topic vagy mi, de valami ilyesmit szeretnék majd én is csinálni, eleinte én is ezen az úton indultam el, de hamar rájöttem, hogy nem valami jó ötlet, főleg az itt olvasottak alapján, ráadásul az itteni terv, az jó pár száz soros.
Noh, az én tervem az csak pár soros, és szinte majdnem hibamentes, még a gyors gombokkal sem kell foglalkozni, és az eredmény is ugyan az, csak ugyebár az esetek 90%-ban az ember a bonyolult és rossz úton indul el.
Nah íme az egyszerű terv:


<html>
<style>
#text{
moz-opacity:0.2;
webkit-opacity:0.2;
opacity:0.2;}
#tartalom {position:absolute;}
</style>
<script>
function beir() {
document.getElementById('tartalom').innerHTML=document.getElementById('text').innerHTML;
}
</script>
<body>

<div id="tartalom"></div>
<div><textarea id="text" rows="4" cols="20" onkeypress="beir()"></textarea></div>
</body>
</html>


Nah mint említettem MAJDNEM hibamentes. A hiba az hogy a textarea-t valamiért nem olvassa ki, kivéve ha már alapból írok valamit a textarea tag-ek közé.

Viszont "input type=text"-el megvalósítható, csak a sortörés fog kimaradni az esetben.

Várnám a pontos megoldást a textarea kiolvasására.

Előre is köszi, és remélem én is segíthettem valamit, legalább a jó irányba való elinduláshoz. :D
17

Value

Kevlar · 2010. Már. 29. (H), 19.59
Ha nincs semmi a tag-ben, akkor nincs is semmi az innerHTML-ben. Így menni fog:
document.getElementById('tartalom').innerHTML=document.getElementById('text').value;
Illetve az eseményt cseréld le onkeyup -ra:
<div><textarea id="text" rows="4" cols="20" onkeyup="beir()"></textarea></div>
18

Tanácsok

Kevlar · 2010. Már. 29. (H), 20.02
Illetve használj diszkrét JavaScriptet, Doctype-ot, és pontosan a böngésző prefix-eket CSS-ben... Érdemes jól megtanulni inkább, mint a rossz beidegződésekkel küzdeni később.
(Ez is a 16-osra válasz.)
19

Uhh, elhamarkodtam az előzőt.

Zserigta · 2010. Már. 29. (H), 20.06
Nah kicsit elhamarkodtam az előző üzit, mert épp, hogy beküldtem, már be is villant a megoldás.

Egyébként durván gyorsan reagáltatok az írásomra, eleve nem gondoltam volna hogy választ kapok rá, azt főképp nem, hogy ilyen hamar.
Jah, és szoktam használni doctypet, prefixet meg hasonlókat, csak gondoltam, az most ide felesleges, mert nem az a lényeg, és felesleges sorokkal nem akartam terhelni a kommentemet, hogy jobban átláthatóbb legyen a irkálmányom. :D

<html>
<style>
#text{
  moz-opacity:0.0;
  webkit-opacity:0.0;
  opacity:0.0;}
#tartalom {
  position:absolute;
  border: black 2px solid;
  width:340px;
  height:100px;}
</style>
<script>
function beir(form) {
  alma=parseInt(Math.random()*1000000);
  document.getElementById('tartalom').innerHTML="<font color='#" + alma + "'>" + form.text.value + "</font>";
}
</script>
<body>
<div id="tartalom"></div>
<form>
  <div>
    <textarea id="text" name="text" cols="40" rows="5" onkeypress="beir(this.form)"></textarea >
  </div>
</form>
</body>
</html>


Nah, én ezzel oldottam meg. Bár a value-s megoldás valószínűleg jobb.
Köszi a segítséget azért.
20

Ékezetes betűk

Totti 1986 · 2012. Szep. 18. (K), 16.23
Sziasztok!

Illik ide a kérdés, ezért nem nyitottam új témát.
Egy form-átalakító pluginhez írtam egy kiegészítőt, ami azt csinálja, hogy ha lenyomsz egy betűt, akkor az eredeti selecthez hasonlóan a listában odagördül a megfelelő elemhez, és beteszi ezt az elemet a legördülősávba is.
Egy probléma van, annak idején ezt egy olyan oldalhoz csináltam, ahol csak számokat kellett beírni, a mostanihoz viszont betűket. Az ékezetes betűket viszont nem veszi be, és ahogy megnéztem, az összes ékezetes betű karakterkódja 0.
Van rá más mód, hogy kiderüljön, melyik ékezetes betű lett lenyomva?

Előre is köszi!
21

keypress

Poetro · 2012. Szep. 18. (K), 17.04
A keypress esemény visszaadja a megfelelő karaktert.
22

A keypress-nél az

Totti 1986 · 2012. Szep. 18. (K), 17.38
A keypress-nél az event.keyCode 0-t vissza minden karakternél.
Viszont azóta megoldottam.
Keydown-ra létrehoztam egy inputot és rátettem a focust, keyup-ra meg kiolvastam a tartalmát és visszatettem a selectre a focust. :)
23

keypress-re kipróbálhatsz egy

Karvaly84 · 2012. Szep. 18. (K), 22.00
keypress-re kipróbálhatsz egy ilyet:

var ch = String.fromCharCode(event.charCode || event.keyCode);
Már rég használtam ezt a megközelítést, de asszem böngészője válogatja a charCode és keyCode elérhetőségét, illetve, hogy melyiknek 0 az értéke.

Próbáld ki mert nem teszteltem.
24

1 órát böngésztem, mikor meg

Totti 1986 · 2012. Szep. 19. (Sze), 00.31
1 órát böngésztem, mikor meg akartam oldani, és megtaláltam a charCode-ot is, de az se használt ékezetes betűknél. Azért köszi.