Javascript 如何捕捉整个浏览器窗口的模糊和焦点?

Javascript 如何捕捉整个浏览器窗口的模糊和焦点?,javascript,jquery,Javascript,Jquery,我想捕捉实际浏览器窗口的模糊和焦点-这意味着将焦点更改为子帧并不重要 目前我一直在使用 $(顶部).focus() $(顶部).blur() 及 $(窗口).focus() $(窗口).blur() 但是,当用户将焦点更改为嵌入式iFrame时,这些会触发,我不希望这样 有人知道一种方法来捕捉窗口的真实激活和停用吗 [编辑] 当用户从网页移动到嵌入iframe的网页时,会触发模糊和聚焦事件。 这与“窗口激活”事件不同,只有当实际的浏览器窗口(或选项卡)被带到前面或发送出去(即,选项卡更改或最小化

我想捕捉实际浏览器窗口的模糊和焦点-这意味着将焦点更改为子帧并不重要

目前我一直在使用
$(顶部).focus()
$(顶部).blur()

$(窗口).focus()
$(窗口).blur()

但是,当用户将焦点更改为嵌入式iFrame时,这些会触发,我不希望这样

有人知道一种方法来捕捉窗口的真实激活和停用吗

[编辑]

当用户从网页移动到嵌入iframe的网页时,会触发模糊和聚焦事件。 这与“窗口激活”事件不同,只有当实际的浏览器窗口(或选项卡)被带到前面或发送出去(即,选项卡更改或最小化)时,才会触发“窗口激活”事件


我对模糊不感兴趣,因为用户已经导航到嵌入的帧这一事实对程序没有影响。但是,如果用户最小化窗口、更改选项卡或切换到另一个程序,我想知道这一点…

如果您不关心在iframe中捕获鼠标事件,可以将此css添加到iframe元素中:

pointer-events:none;
这将指示鼠标事件“穿过”元素,并以该元素“下面”的内容为目标

但是请注意,浏览器之间的兼容性可能会受到限制,即使是那些实现它的浏览器也可能会有不同的做法。 此声明推迟到CSS4草稿,因为它在各种浏览器实现中存在大量问题(根据MDN-请在此处阅读更多信息:)

您不需要jquery。
并且可以解决您的问题:)


该属性可用于设置窗口上的模糊处理程序,当窗口失去焦点时会触发该处理程序。

我认为您可以使用以下类似的方法来禁用该行为

$('iframe').focusin(function(event)
{
    event.preventDefault();
    return false;
});

您可以使用类似的方法来检测浏览器事件

function onBlur() {
    document.body.className = 'blurred';
};
function onFocus(){
    document.body.className = 'focused';
};

if (/*@cc_on!@*/false) { // check for Internet Explorer
    document.onfocusin = onFocus;
    document.onfocusout = onBlur;
} else {
    window.onfocus = onFocus;
    window.onblur = onBlur;
}
来源

我有这个

$(function() {

    $(window)
        .focus(function() { document.getElementById('play_banner').value = true; })
        .blur(function() { document.getElementById('play_banner').value = false; })

 })

在IE、firefox和chrome上运行良好,当play_banner设置为true时,横幅才会显示动画,因此当用户更改页面时,横幅会停止工作,当用户返回时,横幅会从原来的位置继续显示…

我刚刚解决了这个问题。 我需要计算用户在每个页面上花费的时间

以前的实现是这样的:

var isfocused = true
var time_on_page = 0;

function increment_time(){
    if(isfocused = true){
        time_on_page++;
    }
}

settimeout(increment_time, 1000);

function _blur(){
    isfocused = false
}

function _focus(){
    isfocused = true
}

$(window).blur(_blur)
$(window).focus(_focus)
然后我遇到了与您相同的问题:每当用户输入iframe时,它就停止计时。 我所做的就是倾听孩子们的聚焦和模糊事件,比如:

var isfocused = true
var time_on_page = 0;

function increment_time(){
    if(isfocused = true){
        time_on_page++;
    }
    instrument_iframes(); //because iframes might be added later to the dom with javascript
}

settimeout(increment_time, 1000);

function _blur(){
    isfocused = false;
}

function _focus(){
    isfocused = true;
}

function instrument_iframes(){
    var iframes = $('iframe');
    for (var i=0; i<iframes.length; i++){
        var contents = $(iframes[i]).contents();
        if(contents){
            var body = contents.find('body')
            var body0 = body[0]
            if(!body0.instrumented){
                body.blur(this._blur(this));
                body.focus(this._focus(this));
                body0.instrumented = true;
            }
        }
    }
}

$(window).blur(_blur);
$(window).focus(_focus);
instrument_iframes();
var isfocused=true
变量时间页面上的变量时间=0;
函数增量_时间(){
如果(isfocused=true){
页面++上的时间;
}
instrument_iframes();//因为iframes稍后可能会使用javascript添加到dom中
}
设置超时(增量时间,1000);
函数_blur(){
isfocused=false;
}
函数_focus(){
isfocused=true;
}
功能仪表(iframes)(){
变量iframes=$('iframe');

对于(var i=0;iI无法找出区别的方法,抱歉。我已增强了对焦点和激活之间区别的解释。你是否找到了这个问题?我在下面没有看到正确的答案。我遇到了相同的问题。不,很遗憾-没有骰子。可能想检查一下:。经过进一步调查,我写了一些基于关于这一点:感谢Poncha,但我不想影响嵌入式网页的行为-如果它们无法接收指针事件,它们很可能会破坏其功能。感谢RASG-我只是出于习惯而使用jQuery…但为了解决您的解决方案-window.onblur/onfocus不起作用,因为当用户通过Focus时它也会触发s到儿童iFrames(根据我原来的帖子)。至少IE/Chrome是这样。没问题。也许你可以提供一个JSFIDLE?用你的实际代码进行测试会容易得多。我很想提供一个JSFIDLE-但我不能让任何窗口事件在其中工作-我猜这对JSFIDLE不太合适…不,他可能想捕捉到windows,而不是iframe。
var isfocused = true
var time_on_page = 0;

function increment_time(){
    if(isfocused = true){
        time_on_page++;
    }
    instrument_iframes(); //because iframes might be added later to the dom with javascript
}

settimeout(increment_time, 1000);

function _blur(){
    isfocused = false;
}

function _focus(){
    isfocused = true;
}

function instrument_iframes(){
    var iframes = $('iframe');
    for (var i=0; i<iframes.length; i++){
        var contents = $(iframes[i]).contents();
        if(contents){
            var body = contents.find('body')
            var body0 = body[0]
            if(!body0.instrumented){
                body.blur(this._blur(this));
                body.focus(this._focus(this));
                body0.instrumented = true;
            }
        }
    }
}

$(window).blur(_blur);
$(window).focus(_focus);
instrument_iframes();