オートコンプリートドロップダウンのスクロールバーでも同様の問題が発生しました。ドロップダウンは、それがアタッチされているフォーム要素がフォーカスを失ったときに非表示にする必要があるため、正しい要素にフォーカスを維持することが問題になりました。スクロールバーがクリックされたとき、Firefox(10.0)のみが入力要素にフォーカスを保ちました。IE(8.0)、Opera(11.61)、Chrome(17.0)、Safari(5.1)はすべて入力からフォーカスを削除し、ドロップダウンが非表示になりました。また、非表示になっているため、ドロップダウンでクリックイベントが発生しませんでした。
幸いなことに、問題のあるブラウザのほとんどでは、フォーカスの移動を簡単に防ぐことができます。これは、デフォルトのブラウザアクションをキャンセルすることによって行われます。
dropdown.onmousedown = function(event) {
// Do stuff
return false;
}
イベントハンドラーに戻り値を追加すると、IEを除くすべてのブラウザーで問題が解決されました。これを行うと、デフォルトのブラウザアクション(この場合はフォーカスシフト)がキャンセルされます。また、クリックの代わりにマウスダウンを使用すると、入力要素でblurイベントが発生する前にイベントハンドラーが実行されます。
これはIEを唯一の残りの問題として残しました(そこに驚くことはありません)。IEのフォーカスシフトをキャンセルする方法はありません。幸い、IEはドロップダウンでフォーカスイベントを発生させる唯一のブラウザーです。つまり、入力要素へのフォーカスはIE専用のイベントハンドラーで復元できます。
dropdown.onfocus = function() {
input.focus();
}
IEのこのソリューションは完璧ではありませんが、フォーカスシフトをキャンセルすることはできませんが、これが最善の方法です。何が起こるかというと、blurイベントが入力で発生し、ドロップダウンが非表示になります。その後、フォーカスが非表示になったドロップダウンで発生し、入力へのフォーカスが復元され、ドロップダウンの表示がトリガーされます。私のコードでは、ドロップダウンの再入力もトリガーされ、選択が少し遅れて失われますが、ユーザーがスクロールしたい場合は、とにかく選択が役に立たない可能性があるため、これは許容できると思いました。
私の例は質問とは少し異なりますが、これがお役に立てば幸いです。私が集めたものから、質問は、ドロップダウンを開いたボタンではなく、ドロップダウン自体でぼかしイベントを発生させることについてでした。これは私には意味がありません...フォーカスイベントハンドラーの使用が示すように、スクロールバーをクリックしますスクロールバーがIEの一部である要素にフォーカスを移動する必要があります。