2012-03-26 9 views
16

Chciałbym uchwycić rozmycie i ostrość rzeczywistego okna przeglądarki - co oznacza, że ​​zmiana ostrości na ramki podrzędne nie jest interesująca.Jak mogę uchwycić rozmycie i ostrość całego okna przeglądarki?

Obecnie używam $(top).focus() $(top).blur()

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

Jednak te ognia, gdy użytkownik zmienia skupić wbudowanych iframe, które nie chcą.

Czy ktoś wie, w jaki sposób można uchwycić PRAWDZIWĄ aktywację i dezaktywację okna?

[EDIT]

Blur i skupić ogień zdarzenia, gdy użytkownik porusza się ze strony internetowej, do strony internetowej z osadzonym iframe. Różni się to od zdarzeń "aktywacji okna", które są uruchamiane tylko wtedy, gdy rzeczywiste okno PRZEGLĄDARKI (lub zakładka) zostanie przeniesione na wierzch lub wysłane (tzn. Zmienione lub zminimalizowane).

Nie interesuje mnie rozmycie, ponieważ fakt, że użytkownik nawigował do osadzonej ramki, nie ma znaczenia dla programu. Jeśli jednak użytkownik zminimalizuje okno, zmieni kartę lub przełączy się na inny program, chcę o tym wiedzieć ...

+1

Nie mogłem znaleźć sposobu, aby odróżnić, przepraszam. – alex

+0

Ulepszyłem wyjaśnienie różnicy między fokusem a aktywacją. – Adam

+1

Czy kiedykolwiek to rozgryzłeś? Poniżej nie widzę prawidłowej odpowiedzi. Mam ten sam problem. – Redtopia

Odpowiedz

0

Jeśli nie obchodzi Cię przechwytywanie zdarzeń myszy w ramkach iframe, możesz dodać to css do elementów iframe:

pointer-events:none; 

instruuje tego zdarzenia myszy, aby przejść „do” elementu docelowego i co jest „pod” zamiast tego elementu.

Należy jednak pamiętać, że ta zgodność funkcji między przeglądarkami może być ograniczona, a nawet osoby wdrażające ją mogą to robić inaczej. Ta deklaracja jest odroczone do projektu CSS4 powodu ilości spraw to mieliśmy w różnych przeglądarkach wdrożeń (według MDN - czytaj więcej tutaj: https://developer.mozilla.org/en/CSS/pointer-events)

+0

Dziękuję Poncha, ale nie chcę wpływać na zachowanie osadzonych stron internetowych - jeśli nie mogą one otrzymywać zdarzenia wskaźnika, mogą one bardzo dobrze przełamać ich funkcjonalność. – Adam

1

nie trzeba jQuery.
window.onblur i window.onfocus może rozwiązać problemu :)

(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;  
     } 
    } 
})(); 

Obiekt onblur może być używany do obsługi rozmycia ustawić w oknie, które jest wyzwalane, gdy okno traci ostrość.

+0

Dzięki RASG - Po prostu używam jQuery z przyzwyczajenia do wszystkiego ... Ale żeby rozwiązać twoje rozwiązanie - window.onblur/onfocus nie działa, ponieważ uruchamia się także, gdy użytkownik przechodzi fokus do potomnych iFrames (jak na mój oryginalny post). Przynajmniej tak jest w IE/Chrome. – Adam

+1

Nie ma problemu. Może możesz dostarczyć jsfiddle? O wiele łatwiej byłoby przetestować z faktycznym kodem. – RASG

+0

Chciałbym dostarczyć jsFiddle - ale nie mogę dostać żadnego z okien zdarzeń, żeby w nim zadziałało - myślę, że to coś, co nie nadaje się dobrze do jsFiddle ... – Adam

0

Myślę, że można użyć czegoś podobnego do poniższego, aby wyłączyć to zachowanie.

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

Nie, prawdopodobnie chce złapać zdarzenie okien, nie iframe. – Starx

0

Możesz użyć czegoś takiego, aby wykryć zdarzenia przeglądarki.

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

if (/*@[email protected]*/false) { // check for Internet Explorer 
    document.onfocusin = onFocus; 
    document.onfocusout = onBlur; 
} else { 
    window.onfocus = onFocus; 
    window.onblur = onBlur; 
} 

Źródło Post

1

mam ten

$(function() { 

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

}) 

pracuje bez zarzutu na IE, Firefox i Chrome, gdzie tylko transparent animować gdy play_banner jest ustawiony na true, więc przestać działać, gdy użytkownik zmienia stronę, a kiedy wraca, kontynuuje od miejsca, w którym był ...

0

Po prostu naprawiłem ten problem dla sytuacji, którą miałem. Potrzebowałem policzyć ile czasu użytkownik spędził na każdej stronie.

Dotychczasowa realizacja było coś takiego:

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) 

Wtedy miałem ten sam problem, trzeba było: gdy użytkownik wszedł iframe, to zatrzymany czas liczenia. co zrobiłem było słuchać skupić i wydarzenia rozmycie dzieci iframe ciał, tak jak poniżej:

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(); 

Z tej konfiguracji, gdy użytkownik wchodzi do iframe, przeglądarka nazywamy _blur(), a następnie _focus() więc czasomierz się nie zatrzymuje.

To może nie być dokładnie to, co chcesz, ale w zależności od problemu może to być dopuszczalne rozwiązanie. To działa na mój przypadek użycia :-)

Powiązane problemy