繁体   English   中英

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

[英]How can I capture the blur and focus of the entire browser window?

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

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

$(window).focus() $(window).blur()

但是,当用户将焦点更改为嵌入式iframe时,这些会触发,这是我不想要的。

有谁知道捕获TRUE激活和停用窗口的方法?

[编辑]

当用户从网页移动到嵌入式iframe的网页时,模糊和聚焦事件将触发。 这与“窗口激活”事件不同,“事件激活”事件仅在实际的BROWSER窗口(或选项卡)被带到前面或被发送(即,更改或最小化)时触发。

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

我有这个

$(function() {

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

 })

在IE,firefox和chrome上工作正常,当play_banner设置为true时横幅只有动画,所以当用户更改页面时它停止工作,当他回来时它继续从它的位置...

你不需要jquery。
window.onblurwindow.onfocus可以解决你的问题:)

(function(){
    var timer = null;
    var has_switched = false;

    window.onblur = function(){
      timer = settimeout(changeitup, 2000);
    }  

    window.onfocus = function(){
      if(timer) cleartimeout(timer);
    }

    function changeitup(){
        if( has_switched == false ){
            alert('the tab lost focus')
            has_switched = true;    
        }
    }
})();

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

我认为您可以使用以下内容来禁用该行为。

$('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;
}

来源帖子

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

之前的实现是这样的:

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时,它就会停止计算时间。 我做的是听儿童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();

使用此设置,当用户输入iframe时,浏览器将调用_blur()然后调用_focus(),以便计时器不会停止。

这可能不是您想要的,但根据问题,它可能是一个可接受的解决方案。 它适用于我的用例:-)

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

pointer-events:none;

这指示鼠标事件“遍历”元素并且目标是“该元素”下面的任何内容。

但请注意,浏览器之间的这种功能兼容性可能会受到限制,即使是那些实现它的人也可能会有所不同。 这个声明被推迟到CSS4草案,因为它在各种浏览器实现中存在大量问题(根据MDN - 在这里阅读更多内容: https//developer.mozilla.org/en/CSS/pointer-events

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM