2011-09-20 15 views
18

मेरे पास एक सरल स्लाइड शो है जिसे मैंने क्लाइंट के मुखपृष्ठ पर बनाया है, घूर्णन के समय setInterval का उपयोग करके।सेट अंतराल को रोकना जब पृष्ठ/ब्राउज़र फोकस से बाहर है

setInterval पंगा लेना से ब्राउज़र को रोकने के लिए जब पेज ध्यान में नहीं है (किसी अन्य टैब देखा जा रहा है, या किसी अन्य प्रोग्राम), मैं उपयोग कर रहा हूँ:

function onBlur() { 
      clearInterval(play); 
     }; 

     function onFocus() { 

      mySlideRotateFunction(); 

     }; 

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

कहाँ mySlideRotateFunction सेट setInterval और रन कुछ jQuery हालांकि यह अधिकांश समय काम करता है, मुझे लगता है कि, अवसर पर, ऐसा प्रतीत होता है कि बर्लर नहीं चला है, और जब मैं पृष्ठ पर वापस आ जाता हूं तो समय 'निर्मित' होता है और घूर्णन पागल हो जाते हैं।

मैं इस अवसर पर बिल्कुल ऐसा क्यों नहीं कर सकता कि यह अवसर पर क्यों होता है, न कि दूसरों पर।

मेरा प्रश्न- क्या मेरे कोड में कोई समस्या है, और क्या किसी के पास 'रोकना' सेट के लिए बेहतर सुझाव है जब ब्राउज़र विंडो फोकस से बाहर है?

धन्यवाद इस तरह

+0

मैं एक ही समस्या में भाग गया क्योंकि मैं कुछ समय पहले एक परियोजना पर काम कर रहा था - हमने उस परेशान "बग" को ठीक करने की कोशिश की .. लेकिन अंत में हमने कोड का उपयोग किया क्योंकि यह था .. क्योंकि हम कर सकते हैं जब यह अजीब व्यवहार होता है तो पुन: उत्पन्न नहीं होता है :( +1 उम्मीद है कि समाधान के साथ कोई बाहर है :) – walialu

उत्तर

17

कोशिश कुछ:

var myInterval; 
var interval_delay = 500; 
var is_interval_running = false; //Optional 

$(document).ready(function() { 
    $(window).focus(function() { 
     clearInterval(myInterval); // Clearing interval if for some reason it has not been cleared yet 
     if (!is_interval_running) //Optional 
      myInterval = setInterval(interval_function, interval_delay); 
    }).blur(function() { 
     clearInterval(myInterval); // Clearing interval on window blur 
     is_interval_running = false; //Optional 
    }); 
}); 

interval_function = function() { 
    is_interval_running = true; //Optional 
    // Code running while window is in focus 
} 

कुछ परीक्षण के तुरंत setInterval अंदर IE9 और FF6

में किया
+0

तो मूल रूप से बस एक दूसरा स्पष्ट अंतराल जोड़ना? समझदार लगता है, अगर स्पष्ट अंतराल वास्तव में याद किया जा रहा है। मैं थोड़ा सा आपके विचार का परीक्षण करूंगा, देखें कि यह बग को हल करता है या नहीं। –

+0

@ माइकल वाटसन ने कुछ अतिरिक्त कोड जोड़े, इसे "वैकल्पिक" चिह्नित किया। वह कोड कुछ अतिरिक्त सुरक्षा दे सकता है (कम से कम यह एक ही समय में चलने वाले कई अंतराल को रोक सकता है) –

+0

मुझे यह पसंद है। मुझे इसे एक दिन या तो परीक्षण देने दें और मैं आपको बता दूंगा कि मूर्खतापूर्ण बग अभी भी छेड़छाड़ कर रहा है या नहीं। –

3

, अगर दस्तावेज़ केंद्रित है, यह देखने के लिए एक जांच जगह। अंतराल सामान्य रूप से फायरिंग जारी रखेगा, लेकिन अंदर कोड केवल तभी निष्पादित होगा जब दस्तावेज़ केंद्रित है। यदि खिड़की धुंधली हो गई है और बाद में फिर से ध्यान केंद्रित की गई है, तो अंतराल समय को बनाए रखेगा लेकिन document.hasFocus() उस समय के दौरान false था, इसलिए ब्राउज़र को फोकस बहाल होने पर कई बार कोड ब्लॉक को निष्पादित करके "पकड़ने" की आवश्यकता नहीं है।

var timePerInterval = 7000; 
$(document).ready(function() { 
    setInterval(function(){ 
     if (document.hasFocus()) { 
      // code to be run every 7 seconds, but only when tab is focused 
     } 
    }, timePerInterval); 
}); 
संबंधित मुद्दे