LoginSignup
284
266

More than 5 years have passed since last update.

iOS で click イベントがわけのわからない動作をする件について

Last updated at Posted at 2014-08-22

iPhone  iPad  JavaScript  click 
 click 


 jQuery 1.9使


HTML
...
<body>
  <p id="child1">...</p>
  <p id="child2">...</p>
</body>
...

このHTMLに対して、以下のように click イベントを登録してみます。
この場合、#child1 をタップすると click イベントが発生し、関数が実行されます。

$('#child1').on('click', function () { ... });



bind()  click()  delegate() 使 on() on() 使

 p

$('p').on('click', function () { ... });

しかしこれだと、後から動的に挿入された p 要素をクリックしても click イベントが発生しません。これはデバイスに関係なく、当然の仕様で、上記はあくまでイベント登録時に存在する要素のみを対象として、イベントを登録する書き方だからです。

後から動的挿入される要素にも click イベントを登録するには、以下のように書きます。

$('body').on('click', 'p', function () { ... });

もしくは

$(document).on('click', 'p', function () { ... });

使

 'body'  document  click  'p'



'body'  document 使 'body' 

 jQuery  live()  on() 



2 'body'  document iOS 

 Safari  Chrome  click 



 body  document 


'body'  document body 
<body>
  <div class="container">
    <p id="child1">...</p>
    <p id="child2">...</p>
  </div>
</body>

この場合は、以下で動きます。

$('.container').on('click', 'p', function () { ... });


 cursor: pointer 




CSSJavaScript 


<body>
  <p id="child1">...</p>
  <p id="child2">...</p>
</body>
$(document).on('click', 'p', function () { ... });

p {
  cursor: pointer;
}

CSSOK


a



touchstart  touchend 使


 touchstart  touchend 使
PCclick click 
$(document).on('click touchstart', 'p', function () { ... });

該当要素に適当な click イベントを登録しておく

HTMLを以下のように書き換えても、動きます。
あまり綺麗ではないので、特にこの方法を採用するメリットは思い浮かびませんが、これで動くようになる、というのは興味深いです。

<body>
  <p id="child1" onclick="">...</p>
  <p id="child2" onclick="">...</p>
</body>

なぜこのような仕様になっているのか




CSS cursor: pointer  JavaScript 



iOS 

PC



Apple 



aclick cursor: pointer 

 p span  click 

 body  click 

'body'  document 



 Apple 

iOS  click 
284
266
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

284
266