9:53 PM投稿記事の長さ:天声人語 × 4.3個 くらい

jQueryでform部品にフォーカスを当てたままソフトウェアキーボードを閉じる小技


トップイメージ

トップイメージは我が家のキーボード君です。

それはさておき。

スマホやタブレットなどのタッチデバイスでform部品(inputやtextareaなど)にフォーカスが当たると出現するソフトウェアキーボード。

画面の半分、もしくはそれ以上の領域を占領するこのキーボードは他のコンテンツを見ようとするユーザーにとってイライラの原因となる。特に、入力を終えたユーザーにとってのキーボードは意味の無い、一刻も早く消してしまいたいものに違いない。

そこでユーザーは自然と画面の空白部分をタップするわけだが、ここで元々編集していた formからフォーカスが外れてしまう。

特にタッチデバイス向けのアプリなどを開発する際はタップ回数をいかに削減するかが一つのカギで、そのセクションに一つしか入力箇所がないのならば、ユーザーにいちいちフォーカスを当て直させるのは余計な手間である。

しかし、「ソフトウェアキーボードを閉じる条件=フォーカスを外す」となっている以上、フォーカスを当てたままキーボードを閉じるのは難しそうだ。しかも、「ソフトウェアキーボードが開く条件=フォーカスが当たる」なので、一瞬フォーカスを外してまたフォーカスしても再度キーボードが登場してしまう。

そこで今回の記事における主役の登場である。

今回の主役「readonry」属性

若干強引な手段ではあるが、今回の問題を解決してくれるのがinput要素などに設定できるreadonly属性だ。

これが設定されているform部品は読み取り専用になるため、ユーザーからの直接入力を受け付けなくなる(jsでvalue値をいじることは可能)。当然、読み取り専用ということでソフトウェアキーボードも表示されない。

ただし、同じような効果を持つdisabled属性と違い、このreadonly指定されたform部品はフォーカスの受け手となりうる。

つまり、フォーカスを受け取った状態で、すかさずこのreadonly属性を動的に指定してやればフォーカスを維持したままソフトウェアキーボードの出現を防ぐことが出来るのである。

実際のコード

jQuery使用前提なので注意。
[js]
//jQuery使用前提
$(function(){
$(‘input’).blur(function(){
$(this).focus();
$(this).attr(‘readonly’,true);
setTimeout(function(){
$(‘input’).attr(‘readonly’,false);
},10);
});
});
[/js]

ざっと解説

  1. 今回のターゲットであるinput要素からフォーカスが外れたのを検知(3行目)。
  2. 検知したと同時にフォーカスを当て直す(4行目)。
  3. フォーカスが当たったことで発生するキーボードの出現をreadonly属性を指定することで抑止(5行目)。
  4. setTimeoutにより、10mm秒後にreadonlyを外す(6、7行目)。

じっくり解説

input要素からフォーカスが外れたことを検知するblurイベントで作動する関数である。

まず、ユーザーが関係ないところをタップ(クリック)し、キーボードを消したはいいが、フォーカスが外れては困るのでfocus()で再度フォーカスを当ててやる。
ここでキーボードが再登場するのが悩みのタネであったわけだ。

そこで、すかさずattrメソッドでinput要素にreadonly属性を指定し、キーボードを無理やり退場させる。

ここで注意したいのが、attrの第二引数。普段、attr等で属性を指定するときは
.attr(‘id’,’hoge’);
のように指定するのだが、readonlyはオンオフで判断される属性なので第二引数に指定しうるのは true か false の二種類のみ。
しかも、’でくくってしまうと、JavaScript暗黙の了解により ‘false’=true というややこしいことになってしまうので、 true と false は何もくくらないで指定しよう。

さて、これで目標を達成したと思いきや、ここまでだと再度文字を入力しようとinput要素をタップしても二度とキーボードは現れない。readonly属性が指定されっぱなしになっているためなので、解除してやる必要がある。

そこで、setTimeout関数を使い、ごく短い時間(ここでは10mm秒後)の後にreadonly属性を解除。

これで、再度ユーザーがinput要素をタップしたときにキーボードが表示される(ちなみに、setTimeout関数を用いずに $(‘input’).attr(‘readonly’,false); と書くとその前に書いた $(‘this’).attr(‘readonly’,true); が完全に無かったことにされ、キーボードが出現してしまう)。

まとめ

なかなか強引な方法ではあるが、強引に出てくる相手には強引な手段で抑え込むのが一番である。多分。

ただ、この先タッチデバイスの普及、進化により新たなメソッドやらイベントやらが増えるのは確実だと思うので、その時はもっとスマートな方法が登場するだろう。
力技は個人的に大好きであるが、スマートに済むならスマートに済ませたいとろこである。

Comments

  1. 勉強中の学生 より:

    こんにちわ!
    最近スマホにてHTMLの勉強を始めました。まさにこれをやりたく(*^_^*)

    早速上記 スクリプトを hide.js として保存しHTMLから参照したのですが、
    Chromeから実行しても特に変化がなく・・・

    なにかアドバイスいただけないでしょうか?
    よろしくお願いします。

    フォームの入力
    http://../jquery-3.1.1.js
    http://../hide.js

    テスト1
    テスト2

    • noji より:

      勉強中の学生さん

      すみません、載せていたコードが実際のコードと間違っておりました(汗)
      正しくは、4行目と5行目の$(‘this’)が$(this)となっております!

      ご指摘頂きありがとうございました! 間違ったコードを載せておきながら言うのも恥ずかしいですが、勉強頑張ってください! (笑)

  2. yo88vina より:

    Hey mates, tried yo88vina the other day. It’s kinda neat! Registration’s easy and I won a bit. Might be worth a shot. yo88vina

  3. 50betcasino より:

    Put some time into 50betcasino. It is what it is, decent selection, works well. If you need a quick fix give it a shot: 50betcasino

  4. pak33game1 より:

    Heard pak33game1 has some interesting games. Giving it a try tonight, hoping for some fun and maybe to strike it rich. Who knows maybe tonight is the night I win big. pak33game1

  5. The fachai casino login register process was super smooth. Got signed up and playing in minutes! If you wanna try, you can find it here: fachai casino login register

  6. brrider777 より:

    I stumbled upon this gem by accident and now it is my favorite gaming destination. The welcome offer was generous and the ongoing rewards keep the excitement alive. Everything runs smoothly and I never have to wait long for my turns at the tables. brrider777

  7. pkbk8 より:

    pkbk8 has grown on me over time and now it is simply my favorite corner to unwind. The environment is friendly and the flow is always smooth without any awkward delays. I enjoy how it treats me like a regular part of the family. pkbk8

  8. This platform captures the exact vibe of Colombian sports betting and makes it incredibly convenient to use. I love how the interface is designed for our favorite football leagues and the payout speed is honestly unmatched. The customer care team speaks our language and always resolves issues with a smile. It brings so much joy to my match watching days and I trust every transaction completely. You really should try it out for yourself. coapuestasenlinea


Warning: Undefined variable $aria_req in /var/www/html/noji.dev/wp-content/themes/ODD_CODES/comments.php on line 15

Warning: Undefined variable $aria_req in /var/www/html/noji.dev/wp-content/themes/ODD_CODES/comments.php on line 17