質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

1回答

5581閲覧

iOS8で全画面表示(apple-mobile-web-app-capable)時にtouch関連のイベントが届きません

matoi

総合スコア11

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2014/09/18 03:47

タイトルからわかりにくかったので変えました(元iosでのスクロール制限について)

現在iPad上で動かしているwebアプリでスクロール制限をしているのですが、
ios8にアップデートしたところ、touchmoveイベントが取得できなくなりました。

ios8にアップデートしたことが原因なのか、今までがたまたま動いていたのか…

apple-mobile-web-app-capableを使って全画面表示にしています。
ホーム画面に作ったアイコンからでなく、safariから見るとちゃんとスクロール制限がかかりました。
tauchmoveだけでなくtouchstartも取得できませんでした。
ios7のiPadでは問題なくスクロール制限できました。
スクロールをさせたいところではiScrollを使用しています。

lang

1<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1" /> 2<meta name="apple-mobile-web-app-capable" content="yes" /> 3<meta name="apple-mobile-web-app-status-bar-style" content="black" /> 4 5$(document).bind("touchmove", function() 6{ 7 event.preventDefault(); 8});

何か対処法があるのか、
OS側のバグで修正を待つしかないのか、
そもそもコードがおかしいのか、
わかる方がいましたら教えてください。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

iOS8の環境が手元にないので、過去にAndroidで遭遇した経験から少しアドバイスします。

  1. ブラウザからイベントが正しくfireされているか調査する

click, touchstart, touchmove, touchend, touchcancelの各イベントが
そもそも正しくfireされているかをconsole.logするような簡単なリスナーをセットしてチェックすると、
ブラウザから途中のイベントがfireされていないことが原因だった、というケースがありました。

また、Android4.2ではtouchmoveだけをpreventしてもスクロール動作を抑止できず、
全てのtouch系イベントをpreventしてスクロールを抑止し、clickイベントをトリガーとしてtouch系イベントのprevent用ハンドラーをセット、もしくは除去する、といった作りこみをせざるを得なかったケースがありました。

  1. iScroll側の処理をチェックする

iScrollのバージョンにもよるでしょうが、私が以前iScroll系のバグを修正していた時に、
ベンダープレフィックスを調査するロジック(冒頭にある)に、こんなコメントが残されていました。

lang

1/*! 2 * iScroll v4.2.5 ~ Copyright (c) 2012 Matteo Spinelli, http://cubiq.org 3 * Released under MIT license, http://cubiq.org/license 4 */ 5~省略~ 6 vendor = (function () { 7 // [MEMO] by Eiji Hirayama 2013/11/03 8 // Android 4.2の標準ブラウザではこの調査方法だとvendorが 9 // 空文字列になってしまった。 10 // ※prefixなしのtransformが使用可能な為。 11 // その為、webkitでの検査を最優先で行うように修正した。 12// var vendors = 't,webkitT,MozT,msT,OT'.split(','), 13 var vendors = 'webkitT,MozT,msT,OT,t'.split(','), 14 t, 15 i = 0, 16 l = vendors.length; 17 18 for ( ; i < l; i++ ) { 19 t = vendors[i] + 'ransform'; 20 if ( t in dummyStyle ) { 21 return vendors[i].substr(0, vendors[i].length - 1); 22 } 23 }

ようするにCSS transformがベンダー・プレフィックスの調査に使われているが、
プレフィックスなしのtransformが正しくブラウザに実装された段階で、「webkit」の
プレフィックスを見つけ出す前にこの検出処理を抜けてしまっていたことが色々問題を生じていたのです。

以下、そのコード内の修正範囲に残されたコメントを抜粋(その部分のみの抜粋なのでご使用中のバージョンのソースコードと比較してみてください)。

lang

1 TRNEND_EV = (function () { 2 // [MEMO] by Eiji Hirayama 2013/11/03 3 // Android 4.2の標準ブラウザではvendorが空文字列だった。 4 if ( vendor === false ) return false;

lang

1 _start: function (e) { 2 var that = this, 3 point = hasTouch ? e.touches[0] : e, 4 matrix, x, y, 5 c1, c2; 6 7 // [MEMO] by Eiji Hirayama 2013/11/01 8 // DOM要素を追加した際にスクロールできなくなる場合がある 9 // 問題に対応する為に、refresh処理を追加。 10 that.refresh();

lang

1 _end: function (e) { 2 if (hasTouch && e.touches.length !== 0) return; 3~省略~ 4 // [MEMO] by Eiji Hirayama 2013/11/03 5 // Android4.2の標準ブラウザだと、このtouchEndが 6 // 呼ばれた後、onScrollEnd処理が実行されない問題が 7 // 発生した。原因はvendor prefixの調査方法と 8 // prefixなしのtransitonが使用可能であった為。 9 // スクリプト冒頭で対応済。 10 11 if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);

そもそもtransformだけをターゲットにプレフィックスの調査を行うのも、現状いささか乱暴ですなやり方ですが、ご使用のiScrollにこのような処理が組み込まれているのであれば、それが問題を起こしている可能性も考えられます。

投稿2014/09/18 04:51

Eiji_Hirayama

総合スコア73

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matoi

2014/09/18 05:45

ブラウザからイベントが正しくfireされているかを調査した結果です ``` $(document).bind("touchmove", function() { alert( "touchmove" ); event.preventDefault(); }); ``` というコードを試しました(touchmoveとtouchstartを試してみました) × ios8の全画面表示状態から ○ ios8のsafari ○ ios7の全画面表示状態から (全画面表示状態=ホーム画面にアイコンを作成、apple-mobile-web-app-capableタグでURLバーなどを消した状態です。) iScrollはv4.2.5を使用しています。 iScrollの挙動についても同じく上から×○○の状態でした。 iScrollはv5があるようなのでこちらのアップデートも考えましたが、7やsafariからのアクセスだとちゃんと動いているのでまだやっていません。
Eiji_Hirayama

2014/09/18 07:39

そうすると「iOS8で全画面表示(apple-mobile-web-app-capable)時にtouch関連のイベントが届きません」という事象のようですね(iScrollは関係なく)。 お伺いしている内容から察するにwebkitのバグ(あるいは仕様の変更)のようですが、 もう少し他の方の回答を待ちつつも、 ・シンプルなHTMLで(要素が一つしかない状態でjQueryを使わず) ・イベントの網羅的なチェックを行い(click、touchendイベントが届くか、preventDefaultやstopPropagationしない場合、など) ・バグであることが明確になれば、結果を元にwebkitのbugzillaあたりにポストする とよいと思います。 ※とりあえず、iOS8の環境を作っている方からの回答待ってみましょう(こちらに環境が無く申し訳ないです)。。
matoi

2014/09/18 08:28

タイトルから中身が分かりにくかったと思ったので、変更する際にそのまま使わせていただきました。もしまずかったら修正しますのでお知らせください。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問