Firefoxでテキストボックスのonblur
とonfocus
イベントを使用しているときに問題が発生しました。Firefoxでonfocusの前にJavaScriptイベントonblurが発生しています
オペラです。期待どおりに動作します(例:onfocus
が最初に呼び出され、次にonblur
が呼び出されます)。
Firefoxでは、onblur
が最初に呼び出され、次にonfocus
が呼び出されます。これは起こらないはずです。
どのようにこれを修正できますか?
Firefoxでテキストボックスのonblur
とonfocus
イベントを使用しているときに問題が発生しました。Firefoxでonfocusの前にJavaScriptイベントonblurが発生しています
オペラです。期待どおりに動作します(例:onfocus
が最初に呼び出され、次にonblur
が呼び出されます)。
Firefoxでは、onblur
が最初に呼び出され、次にonfocus
が呼び出されます。これは起こらないはずです。
どのようにこれを修正できますか?
このように一部のブラウザが壊れていることを知っておくとよいでしょう。次のコードを考えてみましょう。オペラで
<input type="text" id="t1" onfocus="is_editing=true" onblur="is_editing=false" />
<input type="text" id="t2" onfocus="is_editing=true" onblur="is_editing=false" />
あなたがいずれかのテキストフィールドをクリックした場合、is_editing
はtrueになります。あなたが他のテキストフィールドにタブしたら... is_editing
は間違っています!
上記の変数代入をenableEditing()
とdisableEditing()
のように置き換えると、同じことが起こります。たとえば、あるフィールドから別のフィールドにタブすると編集が無効になります。それは明らかに人々が望むものではありません!
これを回避するために、ほとんどのブラウザでは、今あなたがそうのように本当に厄介な何かを使用する必要がある、document.activeElement
をサポートしています。
function enableEdit() { is_editing = true; }
/* Can't just unset is_editing here, since broken browsers may
call onblur /after/ onfocus when tabbing between two text elements.
So, we only unset if we don't have a text element focused */
function disableEdit() {
if (!document.activeElement) {
/* For old & broken browser support, could traverse every DOM elem to set
elem.onfocus = function(){ document.activeElement = elem; }
For the meantime, I just assume they aren't broken. */
is_editing = false;
}
// If not focused on a text input type, then it's OK to unset.
else if ("text" != document.activeElement.type) {
is_editing = false;
}
}
もちろん、あなたがのonblur/ONFOCUSが起こると思ったものは何でもしてis_editingの割り当てを交換してください。
jQueryでは、上記のdocument.activeElement
と同じ方法で、明らかに$("*:focus")
を使用することができます。
質問を編集してコードをここに含めるか、[jsfiddle](http://jsfiddle.net/)を作成してコードをすばやくテストすることをお勧めします。 –
私の意見では、onblurはonfocusの前に来るのが理にかなっています。さもなければ、フォーカスは一気に2か所にあります。私はIEとFFの両方がこのようにしていると信じています。なぜ、オペラの方法が「正しい」方法だと思いますか? – nnnnnn
私はnnnnnnに同意します。Operaの動作は間違っています。イベントの順序がなぜ重要であるのかを説明してください。コードを修正する方法についての提案があります。 –