2011-07-29 15 views
10

私のWebアプリケーションでは、さまざまなZインデックスでiframeを使用しています。私はiframeのいくつかの要素でtouchstartイベントを検出しています。しかし、入力フィールドがテキスト入力フィールドと重なってtouchstartとなっていると、入力フィールドが不安定になります。フィールドの2回目のタップはフォーカスを外しますが、テキストを選択することはできませんが、テキストフィールド。iframeとontouchstartを使用したMobile Safariでのテキスト選択のバグ

唯一の解決方法は、バックグラウンドフレームでtouchstartイベントのキャプチャを停止することです。私は、仲介者としてイベントをキャプチャするために透明なdivのようなソリューションを好むだろうが、私はまだそれを取得していない。その他の回避策がありますか?

サンプル・ページはjsfiddleであるが、ここではコードは次のとおりです。

<!DOCTYPE html> 
<html> 
    <head> 
     <style type='text/css'> 
      iframe { 
       position:absolute; 
      } 
      #background { 
       border: solid 3px red; 
       z-index:1; 
       width: 20em; 
       height: 20em; 
      } 
      #foreground, #foreground2 { 
       border: solid 2px yellow; 
       z-index:2; 
       top: 15em; 
       height: 5em; 
      } 
      #foreground2 { 
       top: 22em; 
      } 
     </style> 

     <script type='text/javascript'> 
      window.onload=function(){ 
       document.getElementById("foreground").contentDocument.write("<input type='text' value='text'/><input type='text'/>"); 
       document.getElementById("foreground2").contentDocument.write("<input type='text' value='text'/><input type='text'/>"); 

       document.getElementById("background").addEventListener("touchstart", function() { 
        console.log("touch"); 
       }); 
      } 
     </script> 
    </head> 
    <body> 
     <iframe id=background></iframe> 
     <iframe id=foreground></iframe> 
     <iframe id=foreground2></iframe> 
    </body> 
</html> 

答えて

1

ない「良い」解決策はありませんでした。私の特別な状況では、「バックグラウンド」iframeでタッチイベントを監視する必要がなかったため、バックグラウンドでイベントハンドラをオフにしてフォアグラウンドに戻しました。残念なことに、Javascriptはノードにどのイベントが結びついているかを知る方法がありません。私の例では、私はこれを独立して追跡していましたが、うまくいきました。

興味深いことに、1つのiframe内でキャプチャタッチスタートイベントを試してみても、これは発生します。enter link description here私は回避策を疑う

0

Davidが正しいです。この問題を回避する方法はありません。私はそれを見つけようと多くの時間を費やしました。唯一行うべきことは、iframeオーバーレイが開かれたときにすべてのタッチイベントのremoveEventListenerを呼び出し、iframeが終了したときにre-addEventListenerを呼び出すことです。これを行う唯一の方法は、パブリックの名前付き関数をイベントリスナーとして使用して、それを削除できるようにすることです。ある日、DOMレベル3が実装され、eventListenerList()を使用して匿名または非公開イベントリスナの関数 'name'を呼び出すことができるかもしれませんが、ブラウザはまだこれを使用していません。

興味深いことに、この問題はiframeのフォーム要素がタッチイベントリスナーの要素のすぐ上にある場合にのみ発生します。 iframeのフォーム要素がタッチイベントの上にない要素を聞いてもうまくいきます。いくつかの例では(私のものではない)、iframeオーバーレイが閉じたときに、iframeが開いているときに背景要素の高さを1ピクセルに変更し、高さをフルサイズにリセットすることができます。

4

このスレッドはかなり古くなっていますが、このバグがすべてのデバイス(iPhone/iPad)の最新のiOSバージョン(8.4)で引き続き有効であることを確認したかっただけです。

いくつかのテストの後、私はそれは常に次のような状況の下に表示されます確認することができます:JavaScriptのタッチイベントのバインディング(touchstart /との組み合わせでHTMLコンテンツを表示するためのiframe /オブジェクト/埋め込みHTMLタグを使用する場合

  • は、 touchendなど)をHTMLコンテンツ内の要素に追加します。ユーザーがこのiframe/object/embedタグ内のinput要素に触れると、オンスクリーンキーボードで入力しようとしているすべてのものがもう入力フィールドの中に表示されなくなります。 (興味深いことに、キーボードの上の単語の提案は、ユーザーが入力するすべてのものに反応しますが、入力フィールドにはもう表示されません)。時には、入力フィールド内のバックスペース経由でコンテンツを削除することはできますが、何も追加することはできません。

次変異体が存在するように見える:

  1. タッチイベントは、このエラーにつながる入力要素に直接結合されます。

  2. タッチイベントは、内部の入力要素を持つ親要素にバインドされます(直接の子である必要はありません)。

  3. 入力要素は、タッチイベントバインディングで要素の上に視覚的に座っています。この要素がDOM内のどこにあるか、タッチバウンド要素と入力フィールドの間にオーバーレイ要素があるかどうかは関係ありません。タッチバインドされた要素は、(他の要素がその上にあるように)これが起こるために可視である必要もない。タッチ・バウンド要素が後ろにある入​​力フィールドの領域にユーザーが触れると、そのバグが表示されます。これは面白いことです。なぜなら、入力要素がタッチバウンド要素の一部だけをオーバーレイする場合、タッチバウンド要素が後ろにない入力部分に触れることでこのバグが発生しないからです。

ソリューション: まず:あなたがタッチバインド要素の上でpreventDefault /のstopPropagationおよびそのような他のものを試してみる場合は助けていないようです。バインドされた要素のイベント/タッチバインドで何が起こっても問題ありません(テストしましたが、バグが表示されたときに呼び出されることはありません)。タッチバインド要素の 'ポインタイベント:なし'のようなCSSソリューションでさえ、役に立たない。したがって、次のソリューションは、これまで私たちの唯一の希望です:あなただけあなたが本当に必要なときにそれらがアクティブ持っていないときにそれらを削除するよう

  1. は、動的に、すべてのを防ぐために、このスレッドで提案されているようなタッチイベントをバインド上記の3件。

  2. 入力要素が前面にあるときに、タッチイベントバインドを使用して要素またはコンテナを移動します。視覚的に入力フィールドの作業から離して移動するだけで、CSS変換などを使うだけで十分です。 (上記のバグの変種3を参照してください)。したがって、レイアウトに応じて、たとえばページの横から移動してメインコンテンツをオーバーレイする検索フィールドを含むサイドバーがある場合は、メインコンテンツをオーバーレイするのではなく、サイドに移動することを検討してください。

  3. 使用していないときにタッチイベントバインディングを持つ要素に 'display:none'を使用します。これはバグのバリアント3を解決するように見える唯一のCSSプロパティです。 'visibility:hidden'は私のテストでは何の効果もありませんでした。このバグでは、 'display:none'の要素は入力要素にはもう影響しません。 1ページャーを作成している場合は、設定ページや、表示されていない「タッチされた要素をタッチする」と考える必要はありません。これはバグバリアントもちろん​​3.

  4. を防ぐことができます、最善のことは、限り、このバグが存在するように、他のコンテンツを表示するには、インラインフレーム/オブジェクト/埋め込みタグを使用しないことです。

+0

私はバグを追跡するためにこれを提出:https://bugs.webkit.org/show_bug.cgi?id=156518 それはbugs.webkit.orgを使用してWebKitのバグを報告することは常に良い考えです。 – ddkilzer

関連する問題