Blurイベントがクリックイベントの動作を停止させる?
質問
Blur イベントがクリックイベントハンドラーの動作を停止させているように見えますが?私は、テキストフィールドにフォーカスがあるときだけオプションが表示されるコンボボックスを持っています。オプション リンクを選択すると、イベントが発生するはずです。
ここにフィドル例があります。 http://jsfiddle.net/uXq5p/6/
再現するために
- テキストボックスを選択する
- リンクが表示される
- リンクをクリックする
- ぼかしも発生し、リンクが消える
- 他には何も起こりません。
期待される動作です。
ステップ5で、ぼかしが発生した後、クリックも発生する必要があります。どうすれば実現できるでしょうか。
UPDATEです。
しばらく遊んでみたところ、blurイベントによってクリックされた要素がUn-clickableになった場合、すでに発生しているclickイベントが処理されないようにするために、誰かがわざわざ工夫をしたようです。
たとえば
$('#ShippingGroupListWrapper').css('left','-20px');
は問題なく動作しますが
$('#ShippingGroupListWrapper').css('left','-2000px');
はクリックイベントを防止します。
これは Firefox のバグと思われます。なぜなら、要素をクリックできないようにすると 未来 がクリックされますが ではなく をクリックすると、すでに発生しているものをキャンセルします。
その他、クリックイベントの処理を妨げるもの。
$('#ShippingGroupListWrapper').css('z-index','-20');
$('#ShippingGroupListWrapper').css('display','none');
$('#ShippingGroupListWrapper').css('visibility','hidden');
$('#ShippingGroupListWrapper').css('opacity','.5');
このサイトでは、同様の問題を抱えている他の質問をいくつか見つけました。2 つのソリューションが出回っているようです。
-
遅延を使用する。これは、隠蔽とクリックイベントハンドラの間に競合状態を作り出すので、よくありません。また、ずさんでもあります。
-
を使用します。
mousedown
イベントを使用します。しかし、これもあまり良い解決策ではありません。click
は であり、リンクのための正しいイベントです。の動作はmousedown
の動作は UX の観点から直感に反します。特に、ボタンを離す前にマウスを要素から移動させてクリックをキャンセルすることができないため、このような動作が発生します。
さらにいくつか思いつきます。
3.使用
mouseover
と
mouseout
の上に
リンク
を使用して、フィールドのブラーイベントを有効/無効にすることができます。マウスが関与しないため、これはキーボードによるタブ操作では機能しません。
4.最良の解決策は、次のようなものでしょう。
$('#ShippingGroup').blur(function()
{
if($(document.activeElement) == $('.ShippingGroupLinkList'))
return; // The element that now has focus is a link, do nothing
$('#ShippingGroupListWrapper').css('display','none'); // hide it.
}
残念ながら
$(document.activeElement)
は、クリックされた要素ではなく、常に body 要素を返すようです。しかし、1. どの要素が今フォーカスされているか、2. どの要素がぼかしを引き起こしたか (どの要素がぼかしているかではなく) を、ぼかしハンドラ内から知る信頼できる方法があればよいのですが。また、他のイベント (
mousedown
のほかに)、ぼかしの前に発生する他のイベントはありますか?
どのように解決するのですか?
click
イベントが発生した後に
blur
の後に発生するので、リンクは隠されます。代わりに
click
を使う
mousedown
を使えばうまくいくでしょう。
$('.ShippingGroupLinkList').live("mousedown", function(e) {
alert('You wont see me if your cursor was in the text box');
});
他の方法としては、リンクを非表示にする前に
blur
イベントへのリンクを非表示にすることもできます。どちらの方法を取るかはあなた次第です。
関連
-
[解決済み] 要素外でのクリックを検出するにはどうすればよいですか?
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryを使ってドロップダウンリスト(セレクトボックス)から選択されたテキストを取得する
-
[解決済み] 動的に生成された要素にイベントバインディングを行うか?
-
[解決済み] Reactコンポーネント外でのクリックを検出する
-
[解決済み] 入力にフォーカスがあるかどうかをテストするためにjQueryを使用する
-
[解決済み] 子アンカーがクリックされたときに、親のonclickイベントが発生しないようにするにはどうすればよいですか?
-
[解決済み] [Solved] 'blur'イベントが発生したとき、フォーカスがどの要素に*行ったかを調べるにはどうすればよいですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] jQuery: blur() イベントの前に click() を実行する。
-
[解決済み] Node.jsでbase64エンコードされた画像をAmazon S3へアップロードする
-
[解決済み] ExtJS 4のイベントハンドリングについて
-
[解決済み] reactのrender関数でdynamic hrefを作成するには?
-
[解決済み] アサインの左側にJavascriptのオブジェクトブラケット表記({ ナビゲーション } =)があります。
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
-
[解決済み] Reactコンポーネントでthis.setStateを複数回使用するとどうなりますか?
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] $.ajax実行中にローディングイメージを表示する