2013-02-27 4 views
6

मैं एक साधारण जावास्क्रिप्ट क्रोनोग्रफ़ कि "d2" कहा जाता है एक फार्म क्षेत्र पर प्रदर्शित होती है खो देता है, यह जांच करने के लिए कितनी देर तक किसी को एक विशेष कार्य कर रही है पर ले जाता प्रयोग किया जाता है:setTimeout काम नहीं कर रहा है जब खिड़की ध्यान केंद्रित

var milisec=0 
var seconds=0 
var complemento1="" 
document.form1.d2.value='00:00:00' 

function display(){ 
    if (milisec>=9){ 
     milisec=0 
     seconds+=1 
    } 
    else{ 
     milisec+=1 
    } 
    complemento1=complemento2=complemento3=""; 
    if ((seconds%60)<10) complemento1="0"; 
    if ((Math.floor(seconds/60)%60)<10) complemento2="0"; 
    if ((Math.floor(seconds/3600))<10) complemento3="0"; 
    document.form1.d2.value=complemento3+Math.floor(seconds/3600)+":"+complemento2+(Math.floor(seconds/60)%60)+":"+complemento1+(seconds%60) 
    setTimeout("display()",100) 
} 

समस्या यह है कि जब व्यक्ति एक नया टैब खोलता है/किसी अन्य प्रोग्राम का उपयोग करता है तो टाइमर बंद हो जाता है, और तब विंडो फिर से केंद्रित होती है (क्रोम का उपयोग करके) फिर से शुरू होती है। इसमें अजीब व्यवहार है, क्योंकि कभी-कभी यह काम करता है, कभी-कभी ऐसा नहीं होता है।

मैंने कई पदों को देखा जो फोकस पर नहीं होने पर रोकने के लिए एक स्क्रिप्ट की आवश्यकता होती है, मैं बिल्कुल विपरीत और एक किस्मत के साथ एक घंटे से अधिक खोजना चाहता हूं। आपकी मदद बहुत ही सराहनिय है!

+1

nitpick: (प्रदर्शन, 100) 'setTimeout को setTimeout लाइन बदलने के' , तारों का उपयोग न करें क्योंकि इससे अतिरिक्त मूल्यांकन होता है। – epascarello

+0

संभावित डुप्लिकेट [जब मैं क्रोम में एक टैब निष्क्रिय होता है तो मैं सेटइंटरवाल भी कैसे काम कर सकता हूं?] (Http://stackoverflow.com/questions/5927284/how-can-i-make-setinterval-also-work-when- ए-टैब-इन-इनएक्टिव-इन-क्रोम) – epascarello

+7

टैब स्वचालित रूप से टाइमआउट और अंतराल को थ्रॉटल करता है जब टैब केंद्रित नहीं होता है, और मुझे नहीं लगता कि आप इसे अन्यथा करने के लिए मजबूर कर सकते हैं, लेकिन आप आसानी से विसंगतियों की गणना और क्षतिपूर्ति कर सकते हैं , खासकर अगर आप समय की गणना कर रहे हैं। आपके टाइमआउट को अगले 100ms में चलाने के बजाय, वर्तमान समय को बचाने के लिए और समय की तुलना में उस समय की तुलना करने की बजाय। – Mahn

उत्तर

3

जावास्क्रिप्ट टाइमआउट को किसी निश्चित समय पर निष्पादित नहीं किया जाता है। उदाहरण के लिए यदि थ्रेड समाप्त होने पर थ्रेड किसी और चीज़ के साथ व्यस्त होता है, तो यह पहले खत्म हो जाएगा और यह आपके टाइमर को निष्पादित करेगा।

इसके अलावा आपका फ़ंक्शन प्रदर्शन फ़ंक्शन के अंदर समय व्यतीत नहीं करता है, इसलिए प्रत्येक मिलीसेकंद के लिए थोड़ी देर में जोड़ा जाएगा।

टाइमर को लागू करने का सही तरीका सिस्टम समय का उपयोग कर रहा है।

तो कुछ की तरह:

//Call at the beggining to save the start time 
var start_time = new Date() 

// Compute seconds (does not matter when/how often you call it.) 
var milliseconds_since_start = new Date().valueOf() - start_time 

दिनांक वस्तु भी आप के लिए एक घड़ी के रूप में इस अवधि के फ़ॉर्मेट कर सकते हैं:

var m = new Date(milliseconds_since_start) 
m.getMinutes()+":"+m.getSeconds() 
संबंधित मुद्दे