IOS8より前は、入力要素でJavascript .focus()
メソッドを使用しても効果がないように見えました(仮想キーボードは表示されませんでした)。最新のiOS 8リリースの後、.focus()
メソッドを実行してもページのロードには影響がないように見えましたが、ユーザーが画面上のどこかをタッチすると、仮想キーボードが即座に表示され、フォーカスされている要素にページがスクロールします。 (これは、HTML属性「autofocus」を使用する場合の問題でもあります)
この変更により、私のサイトのiOS8ユーザーで問題が発生しました。ユーザーがページ上のボタンをクリックしようとすると、突然のスクロールとキーボードの出現により、画面の下のボタンが意図せずにクリックされてしまいます。
私はこれがiOS8のバグであり、意図的な機能ではないと仮定していますが、私の質問はこの問題を修正するための最も効率的な解決策は何ですか?
.focus()
メソッドを使用するたびに、navigator.userAgent
をチェックしてデバイスがiOS8かどうかを確認する必要がありますか?
あなたは間違いなくiOS 8のバグにぶつかっているようです。 iOS7では、Safariは(見かけ上)ページの読み込み前にフォーカスが設定されたフォーカスのない要素を無視または保持します。これには、_<input autofocus>
_とinput.focus()
の両方が含まれますが、これらはある時点まで、おそらくページの読み込みまで発生します(インラインスクリプトでテストしました)。
IOS 8では、Safariは要素がフォーカスされたことを記憶しているように見えますが、タッチダウンイベントまで実際にはフォーカスしていません。次に、タッチアップを受け取った要素にクリックイベントを盲目的に送信します。
両方のブラウザは、ページのロード後に発生するinput.focus()
に対して同じ動作をします。要素にズームし、キーボードを表示します。
テスト:
input.focus()
ページ読み込み前: http://fiddle.jshell.net/qo6ctnLz/3/show/<input autofocus>
_: http://fiddle.jshell.net/qo6ctnLz/4/show/input.focus()
ページ読み込み後: http://fiddle.jshell.net/qo6ctnLz/6/show/良いニュースは、事前に焦点を合わせたい要素の新しい動作について心配するだけでよいということです。もう1つの良いニュースは、ユーザーエージェントの回避策を使用する必要があるが、オートフォーカスしていないように既に動作しているため、すべてのiOSバージョンに使用できることです。
_if (!/iPad|iPhone|iPod/g.test(navigator.userAgent)) {
element.focus();
}
_
これがアプローチのようです http://www.google.com は、いくつかの基本的なユーザーエージェントテストに基づいて使用します。
そうでない場合は、先に進み、Apple at https://bugreport.Apple.com でレーダーを提出する必要があります。
Cordovaプロジェクトを開発している場合は、この行を追加して修正できます
<preference name="KeyboardDisplayRequiresUserAction" value="false" />
あなたのconfig.xml
ファイル。テスト済みIOS 8.3およびIOS 8.4
IOS 8では、javascript focus()コマンドのデフォルトの処理にAPIの変更があったようです。アプリケーションが、AppleのWebビューファサードを直接制御できるハイブリッドアプリである場合、以下はapples docsから直接のものです。
Webコンテンツがプログラムでキーボードを表示できるかどうかを示すブール値。
[myWebView setKeyboardDisplayRequiresUserAction:YES];
このプロパティがYESに設定されている場合、ユーザーはWebビューの要素を明示的にタップして、その要素のキーボード(または他の関連する入力ビュー)を表示する必要があります。 NOに設定すると、要素のフォーカスイベントにより、入力ビューが表示され、その要素に自動的に関連付けられます。
このプロパティのデフォルト値はYESです。
最後の段落から、このメソッド呼び出しはキーボード専用ではないようです。これは、ボード全体の入力ビュー、つまりドロップダウンおよび日付ピッカーなどのためのものであることを示しています.
このメソッド呼び出しは現在私には機能していないため、バグがあるように見えます。現在受け取っている動作は、デフォルトでNOになっているように対応しています。
私には解決策があります:
ここに_jQuery.focus
_の条件付きモンキーパッチがありますので、どこにでもuserAgentテストを追加する必要はありません。
_if (/iPad|iPhone|iPod/g.test(navigator.userAgent)) {
(function($) {
return $.fn.focus = function() {
return arguments[0];
};
})(jQuery);
}
_
_if /iPad|iPhone|iPod/g.test navigator.userAgent
(($) ->
$.fn.focus = ->
arguments[0]
)(jQuery)
_
注:_arguments[0]
_を返すので、$(el).focus().doSomethingElse()
などのメソッドチェーンを壊しません
2018年にこれに来る人のために、それを修正するプラグインがあります。これをインストールするだけで https://github.com/onderceylan/cordova-plugin-wkwebview-inputfocusfix とinput.focus()
は自動的に動作します余分な仕事。
これについてのバグをApple Bug Reporterに記録し、彼らはそれを重複として閉じました。重複アイテムまたは問題自体について重複アイテムの状態のみが表示されます。