私はこの問題に遭遇し、満足のいく解決策が得られるまでしばらく時間を費やしました。入力要素領域の外側をタップしたときに入力イベントを閉じたかったので、私の問題は元の質問とは少し異なりました。
上記の目的の回答は機能しますが、完全ではないと思います。このページにアクセスして、私と同じものを探している場合の私の試みを次に示します。
jQueryソリューション
touchstartドキュメント全体にイベントリスナーを追加します。画面がタッチされると(タップ、ホールド、スクロールのいずれであるかは関係ありません)、ハンドラーがトリガーされ、次のことを確認します。
- タッチした領域は入力を表していますか?
- 入力に焦点が当てられていますか?
これらの2つの条件が与えられた場合、次にblur()イベントを発生させて入力からフォーカスを削除します。
ps:私は少し怠惰だったので、上記の応答から行をコピーしましたが、コードの一貫性を維持したい場合は、ドキュメントにjQueryセレクターを使用できます
$(document).on('touchstart', function (e) {
if (!$(e.target).is('.my-input') && $('.my-input').is(':focus')) {
document.activeElement.blur();
}
});
Hammer.JSソリューション
または、 Hammer.JSを使用してタッチジェスチャを処理することもできます。イベントでそれを却下したいtapが、ユーザーがページをスクロールしているだけの場合はキーボードがそこにあるはずだとしましょう(または、テキスト選択を押したままにして、それをコピーして入力領域に貼り付けることができます)
そのような状況では、解決策は次のようになります。
var hammer = new Hammer(document.body);
hammer.on('tap', function(e) {
if (!$(e.target).is('.search-input') && $('.search-input').is(':focus')) {
document.activeElement.blur();
}
});
それが役に立てば幸い!