event.relatedTarget 为我工作。如果有,它将在事件中提供另一个 DOM 元素。
例如,如果您有 2 个按钮控制相同的功能,并且不希望在连续单击它们时执行它们的代码。您可以附加一个 focusout 事件处理程序并检查 ID 或类名。
$(".buttons").on("focusout", function (event) {
if($(event.relatedTarget).prop("class").indexOf("buttons") === -1) {
//code to execute
}
});
也许一个更好的例子是我遇到的问题。
我创建了一个自定义下拉列表,旁边有一个按钮。下拉列表可以通过单击列表或按钮来打开和关闭。它也可以在失去对任一对象的焦点时关闭。
在以下场景中,这将成为一个问题。1) 用户通过单击列表对象打开下拉列表。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/