<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Event &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/event/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Tue, 10 Dec 2013 01:19:09 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>&#034;Key&#034; &#8211; Alphabetical Advent Calendar</title>
		<link>https://blog.mach3.jp/2013/12/10/jaac2013-k-key.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 10 Dec 2013 01:19:09 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2013]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Key]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3708</guid>

					<description><![CDATA[&#8220;K&#8221; は key の &#8220;K&#8221;。 keydown / keyup イベント WebアプリケーションのUIを作る際にキーボードショートカットを設定しておく事がありますが、 そ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>&#8220;K&#8221; は key の &#8220;K&#8221;。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-wMc23_ib5BM/UqR4is_KinI/AAAAAAAACYg/c8LPZzoAEDU/s400/ac2013-k.png" alt="K"/></figure>



<p></p>



<span id="more-3708"></span>



<h2 class="wp-block-heading">keydown / keyup イベント</h2>



<p>WebアプリケーションのUIを作る際にキーボードショートカットを設定しておく事がありますが、 そこで必要になるのが <strong>keypress</strong> / <strong>keydown</strong> / <strong>keyup</strong> イベントです。 読んで字のごとく、キーボードのキーを押下した時や離した時に発火するイベントです。</p>



<h3 class="wp-block-heading">イベントを受け取る</h3>



<p>document かテキストインプット/テキストエリア、 あるいは <strong>contenteditable</strong> で編集可能にされた要素でイベントを受け取ります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">document</span>.addEventListener(<span class="hljs-string">"keydown"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
    e.keyCode; <span class="hljs-comment">// 押下されたキーのキーコード</span>
    e.shiftKey; <span class="hljs-comment">// Shiftキーが押されていれば true</span>
    e.ctrlKey; <span class="hljs-comment">// Ctrlキーが押されていれば true</span>
    e.altKey; <span class="hljs-comment">// Altキーが押されていれば true</span>
    e.metaKey; <span class="hljs-comment">// Commandキー（Mac）が押されていれば true</span>
}, <span class="hljs-literal">false</span>);
</code></span></pre>


<p>上のコードのように、引数の Event オブジェクトにどのキーが押されたのか判別するためのプロパティが色々ぶら下がっています。 例えば &#8220;j&#8221; と入力したとき、または &#8220;Shift + j&#8221; と入力した時に何か処理を行いたい場合は次のように判別する事ができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">document</span>.addEventListener(<span class="hljs-string">"keydown"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
    <span class="hljs-keyword">if</span>(e.keyCode === <span class="hljs-number">74</span>){
        <span class="hljs-comment">// "j" と入力した時の処理</span>
    } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(e.shiftKey &amp;&amp; e.keyCode === <span class="hljs-number">74</span>){
        <span class="hljs-comment">// "Shift + j" と入力した時の処理</span>
    }
}, <span class="hljs-literal">false</span>);
</code></span></pre>


<p>keyCode は自分で試しにキーを叩いて調べても良いですし、 <a href="https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent">MDN</a> で一覧表になっているのでそれを調べても良いです。 一番楽なのは <strong>&#8220;shift+j&#8221;</strong> のような文字列からキーイベントを設定してくれるライブラリを利用する事です。</p>



<h3 class="wp-block-heading">Mac と Windows の 「コントロールキー」</h3>



<p>Mac/Windows共に触った事のある方ならご存知の通り、 Macにおける <strong>control</strong> キーは Windows の <strong>Ctrl</strong> キーとは役割が異なります。 Macの場合は <strong>command</strong> キーが Windows の Ctrl キーにあたるのですが、 Event オブジェクトの <strong>ctrlKey</strong> は共に control/ctrl キーを指してしまいます。</p>



<p>その為、例えば Windows で &#8220;Ctrl + k&#8221; に処理を割り当てて Mac では &#8220;command + k&#8221; に割り当てたい場合には、e.metaKey と e.ctrlKey 両方を確認しなければいけません。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> ctrl = e.metaKey || e.ctrlKey;
<span class="hljs-keyword">if</span>(ctrl &amp;&amp; e.keyCode === <span class="hljs-number">75</span>){ ... }
</code></span></pre>


<p>上の例では、Mac環境では &#8220;command + k&#8221; と &#8220;control + k&#8221; 両方に反応するようになります。 「command だけ割り当てて control は反応してほしくない！」というワガママは取り敢えずここでは考えない事にします。</p>



<p>この他にも環境による差異は結構ある様です。</p>



<h2 class="wp-block-heading">ライブラリに任せる</h2>



<p>一々キーコードを確認して分岐するのは面倒なので、ライブラリに任せてみましょう。 環境による差異も物によっては吸収してくれるので助かります。 キーイベントのハンドリングは頻出な処理だと思うのですが、すぐに見つかる物は意外と数が少なかったです。</p>



<h3 class="wp-block-heading"><a href="https://github.com/madrobby/keymaster">Keymaster.js</a></h3>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://github.com/madrobby/keymaster
</div></figure>



<p>ショートカットキーを設定する <strong>key()</strong> メソッドを実装するライブラリです。 依存ライブラリはありません。 第一引数に設定したいキーの組み合わせ、第二引数にコールバックを渡して設定します。 キーの組み合わせはカンマ区切りで複数指定できます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">key(<span class="hljs-string">"ctrl+k, command+k"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e, o</span>)</span>{
    <span class="hljs-comment">// Ctrl+k, command+k 押下時の処理</span>
});
</code></span></pre>


<p>「そんなだれでもつかいそうな名前をグローバルに？」という方の為に <strong>noConflict</strong> メソッドがあるので 衝突を避けたい場合はこれを使いましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> keymaster = key.noConflict();
keymaster(<span class="hljs-string">"ctrl+k"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ ... });
</code></span></pre>


<h3 class="wp-block-heading"><a href="https://github.com/ginpei/jQuery.gpKey">jQuery.gpKey</a></h3>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://github.com/ginpei/jQuery.gpKey
</div></figure>



<p><a href="http://twitter.com/ginpei_jp">@ginpei_jp</a> 氏によるショートカットキーライブラリです。 jQuery に依存します。</p>



<p>特徴は、特殊な文字を使用してキーを指定する点がひとつ。 もうひとつは、jQuery のセレクタに渡した要素で発火したようにエミュレートしてくれる点です。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">".foo"</span>).gpKey(<span class="hljs-string">"down"</span>, {
    <span class="hljs-string">"^k"</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-comment">// Ctrl+k 押下時の処理</span>
    }
});
</code></span></pre>


<p>上の例では、 &#8220;.foo&#8221; 要素がクリックされてアクティブになった状態になると &#8220;ctrl+k&#8221; のショートカットが機能するようになります。</p>



<h2 class="wp-block-heading">気をつけておきたい事</h2>



<p>キーボードショートカットはWebアプリケーションだけの為の物ではなく、 ブラウザが使用している物も多く存在します。</p>



<p>ブラウザが提供しているキーを JavaScript で上書きしてしまうと、 ユーザーが普段使っているかもしれないショートカットを使えなくしてしまい、 使い易くする為のショートカットが逆にユーザビリティを損ねてしまう事になります。</p>



<p>各ブラウザに実装されているショートカットキーを把握して、被らないように注意が必要ですね。</p>



<h2 class="wp-block-heading">参考資料</h2>



<ul class="wp-block-list">
<li><a href="https://developer.mozilla.org/ja/docs/DOM/KeyboardEvent">KeyboardEvent &#8211; DOM | MDN</a></li>



<li><a href="https://github.com/madrobby/keymaster">madrobby/keymaster</a></li>



<li><a href="https://github.com/ginpei/jQuery.gpKey">ginpei/jQuery.gpKey</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
