4

2 つのテキスト ボックスがあり、どちらも jQuery で処理されるぼかしイベントがあります。テキスト ボックスがぼやけている場合、何らかの検証が行われ、検証が失敗した場合は、テキスト ボックスが再フォーカスされます (ひどい考えだと思いますが、この場合は望ましい動作です)。

Chrome で、最初のテキスト ボックスにフォーカスしてから 2 番目のテキスト ボックスにフォーカスしようとすると、次の順序でイベントが発生することがわかります。

  1. text1 から発生したフォーカス
  2. text1 から発射されたぼかし
  3. text1 から発生したフォーカス

ただし、IE8 では次のように表示されます。

  1. ログ: text1 から発生したフォーカス
  2. ログ: text1 から発生したぼかし
  3. ログ: text1 から発生したフォーカス
  4. ログ: text2 から発生したフォーカス
  5. ログ: text2 から発生したぼかし
  6. ログ: text1 から発生したフォーカス

最初のテキスト ボックスが再フォーカスされた場合に、フォーカス イベントとぼかしイベントが 2 番目のテキスト ボックスで発生しないようにする必要があります。

これは、問題を示すフィドルです。この動作は IE8 でのみ発生します。

追加情報: これらのイベント ハンドラーはすべて個別のプライベート スコープにバインドされているため、2 つのテキスト ボックスは (私が知っている限りでは) 互いのハンドラー関数と対話する方法がありません。

4

1 に答える 1

0

私はグローバルな状態を持つのは好きではありませんが、2 番目のテキストエリアで別のぼかしイベントを発生させないように IE8 を納得させることはできないようです。そのため、それを回避する必要があります。最初のテキストエリアのぼかしイベントは、2 番目のテキストエリアがフォーカスされる前に送信されるため、次のことができます。

  • 検証が失敗したかどうかを確認し、失敗した場合は、現在 textarea1 を検証していることをグローバル変数にマークします
  • フォーカス/ぼかしで、現在の要素の代わりに検証されている別の要素がある場合は、イベントを無視して戻ります
  • 検証が成功した場合、現在検証中の要素をグローバル変数から削除します

これはハックですが、バグのあるブラウザを扱うときは、いくつかのハックを使用する必要があります...

于 2012-08-17T09:01:30.040 に答える