[解決済み] [Solved] 'blur'イベントが発生したとき、フォーカスがどの要素に*行ったかを調べるにはどうすればよいですか?
質問
を付けるとします。
blur
関数は、HTMLの入力ボックスに次のような形で追加されます。
<input id="myInput" onblur="function() { ... }"></input>
を発生させた要素のIDを取得する方法はありますか?
blur
イベントが発生した(クリックされた要素)関数の内部で?どのように?
例えば、このようなスパンがあったとします。
<span id="mySpan">Hello World</span>
input要素にフォーカスが当たった直後にspanをクリックすると、input要素にフォーカスが当たらない。この関数はどのようにして、それが
mySpan
がクリックされたのでしょうか?
PS: もしspanのonclickイベントがinput要素のonblurイベントの前に発生すれば、私の問題は解決します。なぜなら、特定の要素がクリックされたことを示す何らかのステータス値を設定できるからです。
PPS: この問題の背景は、AJAXオートコンプリートコントロールを外部(クリック可能な要素)からトリガーしてそのサジェストを表示したいのですが、サジェストが
blur
イベントが発生します。そこで
blur
関数で、ある特定の要素がクリックされたかどうかを調べ、クリックされた場合はblurイベントを無視します。
解決方法は?
うーん...。Firefoxでは
explicitOriginalTarget
をクリックすると、クリックされた要素が引き出されます。と思っていたら
toElement
を使えばIEでも同じことができるのですが、うまくいかないようです...。ただし、新しくフォーカスされた要素をドキュメントから引き出すことはできます。
function showBlur(ev)
{
var target = ev.explicitOriginalTarget||document.activeElement;
document.getElementById("focused").value =
target ? target.id||target.tagName||target : '';
}
...
<button id="btn1" onblur="showBlur(event)">Button 1</button>
<button id="btn2" onblur="showBlur(event)">Button 2</button>
<button id="btn3" onblur="showBlur(event)">Button 3</button>
<input id="focused" type="text" disabled="disabled" />
注意事項
このテクニックは
ではなく
によるフォーカスの変化に対して機能します。
タビング
キーボードでフィールドを操作した場合、ChromeやSafariでは全く機能しません。の大きな問題点は
activeElement
(IEを除く)一貫して更新されないということです。
後
は
blur
イベントが処理され、処理中に有効な値を全く持たなくなる可能性があります! これは、次のようなバリエーションで緩和できます。
Michielが最終的に使用したテクニック
:
function showBlur(ev)
{
// Use timeout to delay examination of activeElement until after blur/focus
// events have been processed.
setTimeout(function()
{
var target = document.activeElement;
document.getElementById("focused").value =
target ? target.id||target.tagName||target : '';
}, 1);
}
これは、ほとんどのモダンブラウザで動作するはずです(Chrome、IE、Firefoxでテスト済み)。 クリック (タブで移動した場合と比較して)。
関連
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み】SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み】module.exports "モジュールが定義されていません"
-
[解決済み] どのラジオボタンが選択されているかをjQueryで知るにはどうしたらよいですか?
-
[解決済み] どのDOM要素にフォーカスがあるかを調べるには?
-
[解決済み] jQueryで名前を指定して要素を選択するには?
-
[解決済み] DOM要素が現在のビューポートで表示されているかどうかを確認するにはどうすればよいですか?
-
[解決済み] JavaScriptやデバッグでDOMノード上のイベントリスナーを見つけるには?
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: $(...).DataTable は関数ではありません。
-
[解決済み】node.js TypeError: path must be absolute or specify root to res.sendFile [JSONのパースに失敗しました]。
-
[解決済み] 解決済み】clearInterval()が動作しない [重複] [重複]
-
[解決済み】未定義のプロパティ 'bind' を読み込めない。React.js【重複あり
-
[解決済み】Reactのeslintエラーはpropsの検証で見つからない
-
[解決済み】エラー:リクエストのエンティティが大きすぎる
-
[解決済み】XMLパースエラー:ルート要素が見つからない コンソールの場所 FF
-
[解決済み】FirefoxでGoogle Maps V3をリモートで使用すると「googleが定義されていません」と表示される。
-
[解決済み】JavaScriptで関数が存在するかどうかを確認する方法は?
-
[解決済み】react router v^4.0.0 Uncaught TypeError: 未定義のプロパティ'location'を読み取れない