event.relatedTargetは私のために働いた。イベント内に他のDOM要素がある場合は、それを提供します。
たとえば、同じ機能を制御する2つのボタンがあり、それらが連続してクリックされた場合にそれらのコードが実行されることを望まない場合です。フォーカスアウトイベントハンドラーをアタッチして、IDまたはクラス名を確認できます。
$(".buttons").on("focusout", function (event) {
if($(event.relatedTarget).prop("class").indexOf("buttons") === -1) {
//code to execute
}
});
おそらくより良い例は私が持っていた問題でしょう。
横にボタンがあるカスタムドロップダウンリストを作成しました。ドロップダウンリストは、リストをクリックするか、ボタンをクリックすることで開閉できます。どちらかのオブジェクトへのフォーカスを失って閉じることもできます。
これは、次のシナリオで問題になります。1)ユーザーがリストオブジェクトをクリックしてドロップダウンリストを開きます。2)ユーザーがボタンをクリックしてドロップダウンリストを閉じます。
何が起こるかというと、リストが開きますが、ユーザーがリストを閉じようとすると、リストはフォーカスを失い、リストを閉じますが、ボタンをクリックしているため、リストは元に戻ります。このタイプのシナリオでは、フォーカスアウトにより2つのオブジェクトが互いに打ち消し合います。
focusoutイベントを作成することで、relatedTargetがイベントを呼び出したターゲットと同じクラスを持たない場合にのみトリガーするように設定できるようになりました。
$(".listControl").on("focusout", function (event) {
if($(event.relatedTarget).prop("class").indexOf("listControl") === -1) {
//Close the drop down list
}
});
http://api.jquery.com/event.relatedTarget/