阐述问题:
我有一个元素,当点击时会收到一个子元素。该子元素被赋予模糊处理程序。
我希望在浏览器失去焦点时(窗口模糊)不要调用该处理程序。
为了达到这个目标,我尝试了几次,这是我目前的努力:
function clicked() {
// generate a child element
...
field = $(this).children(":first");
$(window).blur(function () {
field.unbind("blur");
});
$(window).focus(function () {
field.focus();
field.blur(function () {
save(this);
});
});
field.blur(function () {
save(this);
});
}
这不起作用。似乎正在发生的事情是,当浏览器失去焦点时,该领域首先失去焦点。
答案 0 :(得分:15)
好问题!
这是可能的,而且非常简单。
field.blur(function() {
if(document.activeElement !== this) {
// this is a blur that isn't a window blur
}
});
或者在香草JS中:
field.addEventListener('blur', function() {
if(document.activeElement !== this) {
// this is a blur that isn't a window blur
}
});
编辑:虽然你的回答是关于浏览器失去焦点,但知道Firefox在返回焦点时有异常行为(错误?)。如果您有一个聚焦的输入,然后取消聚焦窗口,则会触发元素的模糊(这就是问题所在)。如果您返回到输入以外的其他内容,则会在秒时间内触发模糊事件。
答案 1 :(得分:0)
执行此操作的一种稍微肮脏的方法可能是在采取行动之前使用setTimeout()
。
var windowFocus;
$(window).focus(function() {
windowFocus = true;
});
$(window).blur(function() {
windowFocus = false;
});
function clicked() {
// generate a child element
...
field = $(this).children(":first");
field.blur(function () {
setTimeout(function() {
if (windowFocus) {
save(this);
}
}, 50);
});
}