2012-04-12 15 views
5

मैं ऐसे की तरह एक जावास्क्रिप्ट कार्यक्रम है:दूसरी सही लंबाई क्यों नहीं है?

function addtime() { 
    curtime = document.getElementById("time").value * 1000; 
    curtime += 1; 
    document.getElementById("time").value = curtime/1000; 
} 
setInterval(function() { 
    addtime(); 
}, 1); 

तुम मेरे कोड है कि मैं 1000 से गुणा कर रहा हूँ और फिर उसे 1000 से विभाजित में देख सकते हैं, और इस वजह से मैं हर बार एक millisecond से बढ़ाने के लिए चाहते हैं, लेकिन "समय" आउटपुट div में सेकंड की मात्रा दिखाएं। लेकिन जब मैंने उस पृष्ठ को खोला जिसमें इस कोड में था, तो दूसरा वास्तव में "दूसरा" नहीं है, अगर आप समझते हैं कि मेरा क्या मतलब है। यह वर्तमान में सामान्य द्वितीय से तीन गुना लंबा है, और मुझे नहीं पता कि क्यों।

तो मेरे कोड में समस्या क्या है, और मैं इसे ठीक करने के लिए क्या कर सकता हूं?

धन्यवाद

लुकास

+1

आप पोस्ट कर सकते हैं "समय" मूल्य? –

+1

मुझे लगता है कि ऐसा इसलिए है क्योंकि आप addTime() को कॉल करते हैं; हर मिलीसेक। इसका अर्थ यह है कि प्रति सेकंड एक हजार कॉल, जो आपका नेविगेटर निश्चित रूप से संभाल नहीं सकता है, इसलिए आप देखेंगे कि संख्या जितनी धीमी होनी चाहिए उतनी धीमी होनी चाहिए। – Salepate

+0

तो समस्या को ठीक करने के लिए मुझे क्या करना चाहिए, और 'पोस्ट "समय" मूल्य' से आपका क्या मतलब है? – think123

उत्तर

4

समस्या यह है कि जावास्क्रिप्ट वास्तव में आपके द्वारा निर्दिष्ट समय पर setInterval कॉल करने के लिए गारंटी नहीं है, लेकिन पहली अवसर पर यह के बाद उस समय बीत चुका है है। इसके अलावा, 1ms बहुत सारे (सभी?) ब्राउज़र के संकल्प के तहत waaayay है।

इसे ठीक से करने के लिए, प्रारंभ समय प्राप्त करें, फिर वर्तमान समय को घटाकर विलुप्त मिलीसेकंड का पता लगाएं।

var start = new Date(); 
var update = function() { 
    var now = new Date(); 
    var elapsed = now - start; 
    // now you can do something with `elapsed`, 
    // like stuff it into the UI 
}; 
setInterval(update, 100); 
+0

+1 वर्तमान-शुरुआत वास्तव में जाने का तरीका है।इस तरह, भले ही ब्राउज़र कुछ सेकंड के लिए "लटकता" हो, फिर भी यह बाद में स्वतः सही हो जाएगा। – Konerak

0

setInterval के बाद से milisecond के रूप में तर्क लेता है, मुझे लगता है कि आप 1000

function addtime() { 
    curtime = document.getElementById("time").value * 1000; 
    curtime += 1; 
    document.getElementById("time").value = curtime/1000; 
} 
setInterval(function() { 
    addtime(); 
}, 1000); 
+0

'सेटइंटरवाल' द्वारा समय को बरकरार रखना ज्ञात है, और इसे निराश किया जाना चाहिए। – Amadan

+0

@ अहमदन: कृपया मुझे इसका विवरण दें। मैं समझ नहीं पा रहा हूँ – sarwar026

+0

यूसुफ के उत्तर में लिंक देखें। – Amadan

3

यहाँ के साथ 1 बदलना चाहिए a video जहां जे Resig बताते हैं कि कैसे जावास्क्रिप्ट innacurate टाइमर है, के संदर्भ में उसकी प्रस्तुति के लिए टाइमर का उपयोग कर के बारे में है परीक्षण में

"ओएसएक्स टाइमर सटीक हैं, मिलीसेकंड के लिए। लेकिन विंडोज़ में टाइमर केवल 15ms अपडेट किया जाता है।"

एन 0 जैकस द्वारा another article यहां बताया गया है कि कुछ मामलों में टाइमर रिज़ॉल्यूशन अलग है और यह ब्राउज़र पर भी निर्भर करता है। 1 एमएस रेज़ोल्यूशन तेज है, लेकिन यह सीपीयू प्रोसेसिंग में एक बड़ा काटने लगेगा, यही कारण है कि ब्राउज़र इसे वापस खींचते हैं। जहां तक ​​मुझे पता है, ब्राउज़र टाइमर (साथ ही प्रतिपादन) को थ्रॉटल करता है, जब टैब फोकस में नहीं होता है।

मैं विशेष रूप से धीमी गति से पीसी जहां एक ही पेज के एक बार में उद्घाटन 4 टैब, ध्यान में केवल एक ही renders पहले (दक्षिणावर्त तेजी आइकन) में एक बहुत क्रोम में यह दिखाई देता है तो, जबकि अन्य (लोड करने के लिए जारी रखने के लिए काउंटर -क्लोवाइड लोडिंग आइकन)।

+0

+1, अच्छे लिंक। – Amadan

+0

सहमत हुए, लेकिन मैं एक मैक का उपयोग करता हूं। – think123

+0

अच्छी तरह से, यह ब्राउज़र के कारण के साथ-साथ अन्य कारकों के कारण भी हो सकता है। मुझे ऐसे दस्तावेज़ नहीं मिले हैं जो इसके बारे में अधिक बताते हैं, बस मैंने जो प्रदान किया है। – Joseph

1

यदि आप अंतराल का दूसरा भाग चाहते हैं तो मिलीसेकंड द्वारा समय बढ़ाने के बजाय सेकंड के अंतराल को सेकंड से बढ़ाएं। फिर आप अपने मूल्य अद्यतन कोड को भी सरल बना सकते हैं।

यहाँ देखें http://jsfiddle.net/NGTXU/

setInterval(function() { 
    document.getElementById("time").value++; 
},1000); 
संबंधित मुद्दे