我想捕捉实际浏览器窗口的模糊和焦点 - 这意味着将焦点更改为子帧不感兴趣。
目前我一直在使用
$(top).focus()
$(top).blur()
和
$(window).focus()
$(window).blur()
然而,当用户将焦点更改为嵌入式iframe时,会触发这些,这是我不想要的。
有没有人知道捕获TRUE激活和停用窗口的方法?
[编辑]
当用户从网页移动到嵌入式iframe的网页时,会触发模糊和焦点事件。 这与“窗口激活”事件不同,“窗口激活”事件仅在实际的BROWSER窗口(或选项卡)被带到前面或被发送掉(即更改或更改标签)时触发。
我对模糊不感兴趣,因为用户导航到嵌入式框架的事实对程序没有影响。但是,如果用户最小化窗口,更改选项卡或切换到另一个程序,我想知道它...
答案 0 :(得分:1)
(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属性可用于在窗口上设置模糊处理程序,当窗口失去焦点时会触发该处理程序。
答案 1 :(得分:1)
我有这个
$(function() {
$(window)
.focus(function() { document.getElementById('play_banner').value = true; })
.blur(function() { document.getElementById('play_banner').value = false; })
})
在IE,firefox和chrome上工作得很好,当play_banner设置为true时,横幅只有动画,所以当用户更改页面时它会停止工作,当他回来时它会从那里继续...
答案 2 :(得分:0)
如果您不关心在iframe中捕获鼠标事件,可以将此css添加到iframe元素中:
pointer-events:none;
这指示鼠标事件“遍历”元素并将目标对准“该元素下面”。
但请注意,浏览器之间的此功能兼容性可能会受到限制,即使是那些实现它的人也可能采用不同的方式。 这个声明被推迟到CSS4草案,因为它在各种浏览器实现中存在大量问题(根据MDN - 在这里阅读更多内容:https://developer.mozilla.org/en/CSS/pointer-events)
答案 3 :(得分:0)
我认为您可以使用以下内容来禁用该行为。
$('iframe').focusin(function(event)
{
event.preventDefault();
return false;
});
答案 4 :(得分:0)
您可以使用类似的内容来检测浏览器事件。
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;
}
来源Post
答案 5 :(得分:0)
我刚刚解决了这个问题。 我需要计算用户在每个页面上花费的时间。
之前的实现是这样的:
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(),以便计时器不会停止。
这可能不是您想要的,但根据问题,它可能是一个可接受的解决方案。 它适用于我的用例: - )