Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: JavaScript: Näppäinyhdistelmän ctrl+enter havaitseminen

Sivun loppuun

HTML5 [17.11.2013 00:44:38]

#

Miten JavaScriptilla voi havaita Ctrl- ja enter -näppäinten painamisen yhtäaikaa? Tarkoitus on siis luoda pikanäppäin eräälle sivun toiminnolle.

Googlaamalla löytyi runsaasti jQuery-esimerkkejä, mutta sama pitäisi tehdä pelkällä JavaScriptilla. Yhden näppäimen painamisen osaan kyllä JavaScriptilla havaita:

// enter: 13 (ctrl: 17)

window.onkeypress = function(e) {
  if (e.keyCode == 13) console.log('Enter-näppäimen painallus havaittu');
};

Lebe80 [17.11.2013 00:46:43]

#

No miksei se jQuery-esimerkki kelpaa?

HTML5 [17.11.2013 00:52:15]

#

Lebe80 kirjoitti:

No miksei se jQuery-esimerkki kelpaa?

Haluasin saada tämän tehtyä ilman jQueryä.

Merri [17.11.2013 00:59:12]

#

Tutki e.ctrlKey arvoja.

HTML5 [17.11.2013 01:01:06]

#

Itse asisassa voisin tehdäkin tuon jQueryllä, mutta ennen sitä seuraavanlainen ongelma olisi ratkaistava:

Chromen kehitystyökalujen konsolissa näkyy seuraavanlainen virhe:

Failed to load resource: the server responded with a status of 404 (Not Found)

Virhe liittyy tiedostoon ”jquery-1.10.2.min.map”, jota ei ole. Sama virhe toistuu aina, kun Chromen kehitystyökalut avaa. Tarvitseeko jQueryä käytettäessä ottaa käyttöön myös edellä mainittu tiedosto vai mistä on kyse?

Lisäys:

Virhe poistuu, kun kehitystyökalujen asetuksista ottaa valinnan ”Enable source maps” pois käytöstä. Tietäätkö kukaan, onko kyseinen valinta oletuksena käytössä ja haittaako kysinen virhe mitenkään?

Merri [17.11.2013 01:21:26]

#

Se ei haittaa mitään. Tuo map vaan kertoo muuttujien oikeat nimet minimoidulle JavaScript-tiedostolle, jolloin virheiden debuggaus on helpompaa.

Yucca [17.11.2013 21:00:53]

#

Hyvä kysymys. Ei ole ihan helppoa. Kuten DOM 3 Events sanoo, tähän on perinteisesti käytetty keyCode- je keyChar-ominaisuuksia, mutta ne toimivat eri tavoilla eri ympäristöissä. Valitettavasti kyseinen dokumentti ei oikein tarjoa rakentavaa vaihtoehtoa. Ja sitten on vielä Event-olioiden erilainen käsittely eri selaimissa, Mutta seuraava näyttäisi toimivan (testattu Firefox, Chrome, IE 10, myös IE 5 -tilassa):

<input id=i>
<script>
document.getElementById('i').onkeypress = function (e) {
  var tapahtuma = e || window.event;
  if(tapahtuma.ctrlKey && (tapahtuma.charCode === 10 ||
                           tapahtuma.charCode === 13 ||
                           tapahtuma.keyCode === 10 ||
                           tapahtuma.keyCode === 13))
    {alert('Ctrl Enter havaittu')}
}
</script>

Merri [18.11.2013 14:39:04]

#

Tämä ei vain näytä toimivan, vaan tietää miksi toimii:

var keyup = function keyup(e) {
    // tarkista onko enter-painike ja ctrl kyseessä
    if(e.keyCode === 13 && e.ctrlKey) {
      // kerro että on
      document.querySelector('body').innerHTML += '<p>Ctrl + Enter</p>';
    }
  };

if(document.addEventListener) {
  document.addEventListener('keyup', keyup);
} else if(document.attachEvent) {
  // käytännössä IE8
  document.attachEvent('onkeyup', function(e) {
    keyup(e || window.event);
  });
}

onkeypress menee IE:ssä Windowsin oman näppäimistökäsittelijän lävitse, josta syötetään vähän väärä arvo suoraan lävitse selaimeen (eli charCode eikä keyCode kuten pitäisi). Näinpä turvallisempaa on käyttää keydown- ja keyup-eventtejä, koska ne palauttavat IE:ssäkin samaa kuin mitä toiset selaimet.

Ja tällä tavoin päästään sitten lopulta siihen, että tarvitsee tarkistaa vain kaksi asiaa, juuri niinkuin pitäisikin. Yllä oleva toimii kaikessa IE8+. Varmaan vanhemmissakin jos jaksaa vaihtaa querySelector('body') tilalle getElementsByTagName('body')[0], mutta niin vanhoista välittäminen alkaa mennä säälittävyyden puolelle.

HTML5 [19.11.2013 18:13:19]

#

Tämä näyttäisi toimivan ainakin IE:n versiossa 9 ja uudemmissa sekä Chromen, Firefoxin ja Operan uusimmissa versioissa.

function ctrlPlusEnter(e) {
	if (e.keyCode == 13) {
		if (e.ctrlKey) {
			alert('Toimii!');
		}
	}
}
window.onkeydown = ctrlPlusEnter;

Onko tuohon luottamista, sillä koodi tuntuu ”liiankin yksinkertaiselta” toimiakseen oikein vaadituilla selaimilla?

Riittää siis, kun koodi toimii oikein IE:n versiolla 9 ja uudemmilla sekä muiden selainten uudehkoilla versioilla.

Merri [19.11.2013 19:01:43]

#

Se riittää IE9+. Tosin käytä === eikä ==, koska vertailet numeroa numeroon. Muutenkin kannattaa usein suosia ===, koska se vähentää mm. bugien riskiä.

== vertailee kahta muuttujaa toisiinsa ja tarvittaessa pakottaa toisen vertaillun muuttujan yhteensopivaksi toisen muuttujan kanssa, jotta muuttujien arvoja voidaan vertailla.

=== vertailee ensin kahden muuttujan tyyppiä ja vasta sitten niiden arvoa, mikäli tyyppi on sama. Huomattavasti nopeampaa sen lisäksi, että vähentää vaikeasti havaittavien bugien riskiä.

HTML5 [19.11.2013 19:16:47]

#

Kiitoksia! Hyvä lopputulos: Yksinkertaiseen toimintoon yksinkertainen ja lyhyt koodi:

window.onkeydown = function(e) {
	if (e.keyCode === 13 && e.ctrlKey) {
		alert('Toimii!');
	}
}

nixu89 [27.11.2013 11:53:37]

#

Lebe80 kirjoitti:

No miksei se jQuery-esimerkki kelpaa?

näin yksinkertaisen toteutuksen takia tuskin kannattaa ladata kokonaista kirjastoa?

Lebe80 [27.11.2013 15:49:38]

#

nixu89 kirjoitti:

Lebe80 kirjoitti:

No miksei se jQuery-esimerkki kelpaa?

näin yksinkertaisen toteutuksen takia tuskin kannattaa ladata kokonaista kirjastoa?

Näin yksinkertainen toteutus taisi ratketa jo viikko sitten.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta