レスポンシブなサイトを作成していてモバイルの時によくある、メニューアイコンを押したら全画面にメニューが表示されてメニュー以外をクリックするとメニューが閉じる機能を作っていました。
Chromeの開発ツールでは意図したとおりに動作していたのですが、iPhone実機で確認した所メニュー以外の部分をタップしたらメニューを閉じる機能が動作していませんでした。
確認環境
clickイベントが効かないパターンがあるっぽい
動作しなかった例
$(document).on('click', 'div.hitarea', function(){ /*... 処理 */ });
※ 対象の要素を解りやすくするために敢えてdiv.hitarea
と書いています
どうやら$(document).on
や$('body').on
のようなイベントの登録のしかたで、イベント対象がaタグではない時にクリックイベントが無視されてしまうようです。
解決方法
1. クリック対象となる要素にcursor: pointer
というスタイルを付ける
クリック対象の要素にcursor: pointer
というスタイルがあれば、a
タグでなくてもクリックイベントが効くようになるようです。(イベントがdocumentやbodyといったものに登録されている場合イベントターゲットがpointerな要素ならタップ可能な要素だとiOSが判定するような仕組みっぽいです。)
今回の例だと次のようにスタイルを加えるとクリックイベントが動作するようになりました。
div.hitarea { cursor: pointer; }
ボタンのように使いたい機能だった場合はこの方法が簡単です。
しかし、今回のようなレスポンシブなサイトで、ボタンエリア以外をクリックしたらメニューを閉じたいというような場合、モバイルで見てる時は良いのですがPCで見るとモーダルのメニュー上どこにマウスを持っていってもカーソルがクリック可能なポインターになってしまうので、ちょっと問題がありました。
2. document, body にイベントを登録しなければOK
iOSでクリックイベントが動作しないのは、document
またはbody
にイベントが登録されている かつ 対象の要素がaタグでない(pointerのスタイルがない) とき ですので、$(document).on
、$('body').on
としなければ問題なく動作します。
例えば次のようなHTML構造で
<body> <div class="container"> <div class="hitarea"></div> </div> </body>
単純に最初から画面にある該当要素だけでクリックイベントが効けば良いのであれば
$(document).on('click', 'div.hitarea', function(){ /*... 処理 */ });
ではなく
$('div.hitarea').on('click', function(){ /*... 処理 */ });
とすればOKです。
後から追加される要素にもクリックイベントが効く必要があるときは、
$('.container').on('click', 'div.hitarea', function(){ /*... 処理 */ });
上記のようにdocument
やbody
ではなく対象となる要素が追加される親要素にイベント登録をすれば、後から追加されるdiv.hitarea
要素にもクリックイベントが効くようになります。
Chromeの開発ツールで見た目と動作問題ないなーと思っても実機だと挙動が異なることがあるってのを改めて実感しました。(iOSで見てたブラウザもデフォルトのSafariでChromeとも異なりますからそりゃ違いもありますよねw)
モバイルサイト製作時はめんどくさがらずに、ケーブル繋いで実機のブラウザで見て確認・デバックをしなきゃなーって思いました。(でも、ちょっとめんどくさい...
過去にa
タグだけどclickイベントが効かない事があったのですが、href
属性を付けていなかったので、cursor: poinrer
のスタイルが無い扱いになってたから、動作しなかったんじゃないかなって今回の件でナゾが判明した気がしました。
[参考]
- javascript - $(document).click() not working correctly on iPhone. jquery - Stack Overflow
- iOS で click イベントがわけのわからない動作をする件について - Qiita

レスポンシブWebデザイン マルチデバイス時代のコンセプトとテクニック (Web Professional Books)
- 作者: 菊池崇
- 出版社/メーカー: KADOKAWA / アスキー・メディアワークス
- 発売日: 2013/07/31
- メディア: Kindle版
- この商品を含むブログを見る