2012-03-26 18 views
16

मैं धुंध को पकड़ना और वास्तविक ब्राउज़र विंडो का ध्यान केंद्रित करना चाहता हूं - जिसका अर्थ है कि बच्चे के फ्रेम पर ध्यान केंद्रित करना ब्याज का नहीं है।मैं पूरे ब्राउजर विंडो के धुंध और फोकस को कैप्चर कैसे कर सकता हूं?

वर्तमान में मैं $(top).focus() $(top).blur()

और $(window).focus() $(window).blur()

हालांकि, इन आग का उपयोग किया गया है जब उपयोगकर्ता परिवर्तन एम्बेडेड iframes का, है जो मैं नहीं चाहता करने के लिए ध्यान केंद्रित।

क्या किसी को भी सही सक्रियण और खिड़की के निष्क्रियण को पकड़ने के तरीके के बारे में पता है?

[संपादित करें]

धुंधला और घटनाओं आग ध्यान केंद्रित जब एक वेब पेज से एक उपयोगकर्ता चलता है, एक एम्बेडेड iframe के वेब पेज के लिए। यह 'विंडो सक्रियण' घटनाओं से अलग है, जो केवल वास्तविक ब्राउजर विंडो (या टैब) को सामने लाया जाता है, या भेजा जाता है (यानी, टैब बदलता है, या कम किया जाता है)।

मुझे धुंध में रूचि नहीं है, क्योंकि तथ्य यह है कि उपयोगकर्ता ने एम्बेडेड फ्रेम पर नेविगेट किया है, कार्यक्रम का कोई परिणाम नहीं है। हालांकि, यदि उपयोगकर्ता विंडो को छोटा करता है, टैब बदलता है, या किसी अन्य प्रोग्राम में स्विच करता है, तो मैं इसके बारे में जानना चाहता हूं ...

+1

मैं अंतर बताने का कोई तरीका नहीं समझ सका, क्षमा करें। – alex

+0

मैंने फोकस और सक्रियण के बीच अंतर की व्याख्या को बढ़ाया है। – Adam

+1

क्या आपने कभी यह पता लगाया था? मुझे नीचे एक सही जवाब नहीं दिख रहा है। मुझे एक ही समस्या है। – Redtopia

उत्तर

0

यदि आपको अपने आईफ्रेम के अंदर माउस ईवेंट कैप्चर करने की परवाह नहीं है, तो आप इस सीएसएस को जोड़ सकते हैं iframe तत्वों के लिए:

pointer-events:none; 

यह तत्व और लक्ष्य जो कुछ भी "के नीचे" उस तत्व के बजाय है "के माध्यम से" जाने के लिए माउस घटनाओं निर्देश देता है।

नोट हालांकि, ब्राउज़र के बीच यह सुविधा संगतता सीमित हो सकती है, और यहां तक ​​कि इसे लागू करने वाले लोग भी अलग-अलग कर सकते हैं। यह घोषणा सीएसएस 4 ड्राफ्ट पर स्थगित कर दी गई है क्योंकि यह विभिन्न ब्राउज़रों के कार्यान्वयन में किए गए मुद्दों की मात्रा (एमडीएन के मुताबिक - https://developer.mozilla.org/en/CSS/pointer-events)

+0

धन्यवाद पोन्चा, लेकिन मैं एम्बेडेड वेबपृष्ठों के व्यवहार को प्रभावित नहीं करना चाहता - अगर वे प्राप्त नहीं कर सकते सूचक घटनाएं, वे अपनी कार्यक्षमता को बहुत अच्छी तरह से तोड़ सकते हैं। – Adam

1

आपको jquery की आवश्यकता नहीं है।
window.onblur और window.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 संपत्ति खिड़की है, जो जब खिड़की ध्यान केंद्रित खो देता है शुरू हो रहा है पर कलंक हैंडलर स्थापित करने के लिए इस्तेमाल किया जा सकता का समाधान कर सकते हैं।

+0

धन्यवाद आरएएसजी - मैं बस सब कुछ के लिए jQuery से बाहर का उपयोग करता हूं ... लेकिन अपने समाधान को संबोधित करने के लिए - window.onblur/onfocus काम नहीं करता है क्योंकि यह तब भी आग लग जाता है जब उपयोगकर्ता बच्चे iFrames (मेरे मूल पोस्ट के अनुसार) पर ध्यान केंद्रित करता है। कम से कम यह आईई/क्रोम में मामला है। – Adam

+1

कोई समस्या नहीं है। शायद आप एक jsfiddle प्रदान कर सकते हैं? आपके वास्तविक कोड के साथ परीक्षण करना बहुत आसान होगा। – RASG

+0

एक जेएसफ़िल्ड प्रदान करना अच्छा लगेगा - लेकिन मुझे इसमें से किसी भी विंडोिंग घटनाओं को काम करने के लिए नहीं मिल रहा है - मुझे लगता है कि यह ऐसा कुछ है जो खुद को जेएसफ़ाइल के लिए अच्छी तरह से उधार नहीं देता है ... – Adam

0

मुझे लगता है कि आप उस व्यवहार को अक्षम करने के लिए निम्न की तरह कुछ उपयोग कर सकते हैं।

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

नहीं, वह शायद खिड़कियों की घटना को पकड़ना चाहता है, iframe नहीं। – Starx

0

आप ब्राउज़र घटनाओं का पता लगाने के लिए ऐसा कुछ उपयोग कर सकते हैं।

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

स्रोत Post

1

मैं इस

$(function() { 

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

}) 

आईई, फ़ायरफ़ॉक्स और क्रोम, जहां बैनर केवल चेतन जब play_banner सही पर सेट है पर ठीक काम कर रहा है, तो यह जब काम करना बंद उपयोगकर्ता पृष्ठ को बदलता है, और जब वह वापस आ जाता है तो यह कहां से जारी रहता है ...

0

मैंने बस अपनी स्थिति के लिए इस समस्या को ठीक किया। मुझे यह गिनने की आवश्यकता है कि उपयोगकर्ता प्रत्येक पृष्ठ में कितना समय व्यतीत कर रहा था। जब भी उपयोगकर्ता एक iframe में प्रवेश किया, यह समय की गिनती बंद कर दिया:

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(); 
इस स्थापना के साथ

, जब उपयोगकर्ता iframe में प्रवेश करती है, ब्राउज़र _blur फोन करेगा() और फिर _focus तो टाइमर बंद नहीं होता है।

यह वही नहीं हो सकता है जो आप चाहते हैं, लेकिन समस्या के आधार पर यह एक स्वीकार्य समाधान हो सकता है। यह मेरे उपयोग के मामले के लिए काम करता है :-)

संबंधित मुद्दे