3

Chrome と Safari では 100% 正常に動作する次のコードがありますが、IE 10 では動作する場合と動作しない場合があります。

Sys.Focus = function(obj){    
    if(Sys.Anim.length>0){
       Sys.Fp = obj;
       return;
    }
    obj.focus();
}

.
.
.

function Animate(...){
   var i,...
   .
   .
   .

   if(Finished(Sys.Anim[i])){
      Sys.Anim.splice(i,1);
      if(Sys.Anim.length==0){
         if(Sys.Fp){
            Sys.Focus(Sys.Fp)
            Sys.Fp = null;
         }
      }
   }
   .
   .
   .    
}

.
.
.

email = document.getElementById("email");
Sys.Focus(email);
email.onkeydown = function(){
   debugger
   .
   .
   .
}

さまざまなユーザー アクションに応答して、画面上の一部のオブジェクトの色が変化したり動き回ったりします。これは Animate() によって行われ、アニメーション化されるオブジェクトは配列 (Sys.Anim) に追加され、アニメーションが終了すると削除されます。すべてをスムーズに保つために、アニメーションが終了する前にページが入力可能になった場合 (ほとんどの場合発生します)、アニメーションが終了するまでfocus()呼び出しが遅延されます。これは約 1/3 秒です。

IE 10 を除くすべてのブラウザーですべてが期待どおりに機能します。最初はコードに論理エラーがあると思っていましたが、開発者ツールでデバッグしたところ、すべての手順が正しく実行されていることがわかりました。問題はフォーカス( )実際には常に機能しているわけではありません。

別の重要な詳細... focus()が成功すると、キーを押すたびにemail.onkeydownが実行されますが、 focus()が失敗すると、入力コントロールをクリックして手動でフォーカスする必要がありますが、これが発生するとemail.onkeydownキー パンチのたびに入力コントロールの内容が更新される場合でも、関数が呼び出されることはありません。

私が試した:

setTimeout(function(){obj.focus()},100);

これはこの問題の解決策として提案されましたが、私のものは解決しません。

なぜこれが起こり、どのように回避できますか?

アップデート:

テストの提案のために、次の関数を追加しました。

email.onfocus = function(){
   debugger
}

focus()が成功した場合にのみデバッガーを表示します。 focus()が失敗した場合、マウス クリックで入力コントロールを手動でフォーカスしても、デバッガーはポップアップしません。 Tab キーまたは Shift-Tab キーは... 存在しないかのようです!!!

4

1 に答える 1