iOS8の環境が手元にないので、過去にAndroidで遭遇した経験から少しアドバイスします。
- ブラウザからイベントが正しくfireされているか調査する
click, touchstart, touchmove, touchend, touchcancelの各イベントが
そもそも正しくfireされているかをconsole.logするような簡単なリスナーをセットしてチェックすると、
ブラウザから途中のイベントがfireされていないことが原因だった、というケースがありました。
また、Android4.2ではtouchmoveだけをpreventしてもスクロール動作を抑止できず、
全てのtouch系イベントをpreventしてスクロールを抑止し、clickイベントをトリガーとしてtouch系イベントのprevent用ハンドラーをセット、もしくは除去する、といった作りこみをせざるを得なかったケースがありました。
- 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 05:45
2014/09/18 07:39
2014/09/18 08:28