2011-12-12 17 views
5

मुझे पता है कि वर्तमान में गलत ब्राउज़र टाइमर के कारण अंतर नगण्य होगा, लेकिन ज्ञान के लिए यदि कुछ और नहीं है: क्या कोई ब्राउज़र है जो सेट इंटरवल और सेटटाइमआउट का समर्थन करता है, लेकिन यह आवश्यक है कि उन्हें देरी के रूप में एक पूर्णांक मान पारित किया जाए?क्या सेट अंतराल या सेटटाइमआउट को एक अंशकालिक विलंब पास करना सुरक्षित है?

setInterval(animate,50/3); 
क्रॉस-ब्राउज़र इस रूप में संगत के रूप में

:

या, उदाहरण के साथ rephrased, है?

setInterval(animate,17); 
+0

जिस तरह से परिभाषित किया गया है, दूसरा तर्क "मिलीसेकंड की संख्या" है। अब, अगर वह संख्या प्राकृतिक होनी चाहिए तो परिभाषित नहीं किया गया है ... –

+0

@ ŠimeVidas यह पूरी तरह से परिभाषित है। डीओएम विनिर्देश देखें ;-) –

उत्तर

6

यह पूरी तरह से सुरक्षित है।

(RobG बताते हैं, मैं डोम/जे एस पुल नियमों के लिए एक संदर्भ के लिए खुद को उपलब्ध नहीं करा दिया है और वह सावधानी FWIW का आग्रह, मेरा मानना ​​है कि -। लेकिन कोई संदर्भ के लिए अंतिम तौर राज्य है - कि ToInteger है इंटरफ़ेस पुल का हिस्सा। यहां एक jsfiddle है जो एक स्ट्रिंग, एक फ्लोट, और एक अभिन्न (जेएस में फ्लोट के समान प्रकार) के रूप में पारित होने वाला टाइमआउट दिखा रहा है जो एफएफ 8 और आईई 9 में ठीक काम करता है। फीडबैक स्वागत है।)

क्योंकि setTimeout/setInterval में देरी के लिए - yup, इन्हें डीओएम में परिभाषित किया गया है, ईसीएमएस्क्रिप्ट में नहीं। विलंब मान उचित रूप से एक अभिन्न मूल्य में परिवर्तित किया जाता है (और इस पहलू में [जेएस-आंतरिक] ToInteger फ़ंक्शन को लागू किया जाता है जो एक छिड़काव *) करता है।

हालांकि, उदाहरण संख्या वास्तव में निकलेगा थोड़ा अलग परिणाम (हालांकि यह उल्लेखनीय नहीं हो सकता है) :-)

इसका कारण यह है 50/3 (16.66andsomemore ->16) जाता है और 17अलग समय समाप्ति निर्दिष्ट ।

हैप्पी कोडिंग।


* ToIntegersign(number) * floor(abs(number)) के रूप में परिभाषित किया गया है, विशेष मामलों को छोड़कर। 5 वें संस्करण ईसीएमएस्क्रिप्ट विनिर्देश के खंड 9.4 देखें।

+0

ठीक है, तो यह spec सी (या कुछ और जावास्क्रिप्ट नहीं) कार्यान्वयन का वर्णन कर रहा है, है ना? तो जावास्क्रिप्ट पर्यावरण के बाहर छंटनी होती है? –

+0

@ skier88 तकनीकी रूप से डीओएम कार्यान्वयन * में * होना नहीं है - हालांकि मुझे संदेह है कि यह ज्यादातर मामलों में है - लेकिन यह मान को एक अभिन्न "लंबे" तक सीमित करता है। जेएस इंजन के एक [एन पहुंच योग्य] उपयोगकर्ता भाग है जो जानता है कि "डीओएम से बात करें" जो डीओएम से रूपांतरण करता है। पोस्ट किया गया लिंक सिर्फ * इंटरफ़ेस * अनुबंधों को कवर करता है। 'ToInteger' फ़ंक्शन ECMAScript में परिभाषित एक आंतरिक फ़ंक्शन है, और मुझे विश्वास है - लेकिन मैं गलत हो सकता हूं - कि यह (या समकक्ष) अभिन्न रूपांतरण में उपयोग किया जाता है। –

+0

हाँ, मुझे पता है कि भाषा भिन्न हो सकती है, यह मुझे एक प्रोग्रामिंग भाषा के बारे में सोचने में मदद करता है ताकि यह देखने के लिए कि किस स्तर पर कोड कोड निष्पादित किया जा रहा है।प्रतिक्रिया के लिए धन्यवाद - मुझे शायद बहुत समय पहले विनिर्देश डाउनलोड करना चाहिए था। –

0

मैं कल्पना कर सकते हैं कि दूसरा पैरामीटर और जब तक यह एक नंबर यह काम करेंगे देता है एक अभिव्यक्ति के रूप में मूल्यांकन किया जाएगा। ऐसा लगता है क्रोम में काम करता है। बस सुनिश्चित करें कि आप शून्य से विभाजित नहीं हैं!

0

ये कार्य मिलीसेकंड की अपेक्षा करते हैं। मुझे संदेह है कि आप 10ms से अधिक सटीकता की उम्मीद कर सकते हैं, और ब्राउज़र enforce timer restrictions ब्राउज़ कर सकते हैं।

फ़ायरफ़ॉक्स दशमलव मानों को नहीं मानता है। आप किसी अन्य ब्राउज़र में can test के बारे में उत्सुक हैं।

+0

उत्तर के लिए धन्यवाद। उपरोक्त के रूप में, मैं सटीक समय से बहुत चिंतित नहीं हूं जितना बहाव (यह हो सकता है कि यह हो सकता है)। –

3

जावास्क्रिप्ट फ़्लोटिंग पॉइंट नंबर और पूर्णांक के बीच कोई वास्तविक भेद नहीं करता है, और हुड के नीचे एक ही डेटा प्रकार है। 1 और 1.0 स्मृति में थोड़ा समान के लिए थोड़ा सा हैं।

इसलिए हाँ, आप किसी भी वास्तविक मुद्दों के बिना एक आंशिक मूल्य पारित कर सकते हैं। यह पूरी तरह से वैध जावास्क्रिप्ट है। और यहां तक ​​कि अगर इसे एक पूर्णांक की आवश्यकता होती है, तो यह अधिक संभावना है कि यह आपके लिए बस और चुपचाप इसे नीचे रखेगा।

लेकिन यह सटीक होने की अपेक्षा न करें!0.1 का समय, 1 या यहां तक ​​कि 4.87 कॉलबैक शेड्यूलिंग की कम ग्रैन्युलरिटी के कारण सभी एक ही समय में बहुत करीब आग लगेंगे।

+0

धन्यवाद, मैं कुछ कारणों से डेटा प्रकार नहीं सोच रहा था। और granulatiry के बारे में अच्छी बात - आईआईआरसी, यह वास्तव में अक्सर 15ms के रूप में बुरा है। मेरी चिंता वास्तव में केवल लंबे समय से चलने वाले अंतराल के (संभवतया अचूक) बहाव के लिए है। –

+0

बहाव असली है और यह एक समस्या थी जिसे मैंने हाल ही में समय संगीत बीट्स के साथ उपयोग करने में भाग लिया था। और यह बेकार है। यह मेरा समाधान था: http://alexwayne.tumblr.com/post/13744997785/accurateinterval या गद्य को छोड़ें और मेरा कच्चा कोड यहां प्राप्त करें: https://gist.github.com/1d99b3cd81d610ac7351 –

+0

तथ्य यह है कि '1' और '1.0' जावास्क्रिप्ट भाषा में समान संख्या मान का प्रतिनिधित्व करता है यहां प्रासंगिक नहीं है। प्रश्न 'setTimeout' फ़ंक्शन के व्यवहार के बारे में है। ध्यान दें कि यह फ़ंक्शन जावास्क्रिप्ट भाषा का हिस्सा नहीं है। यह एक ब्राउज़र फ़ंक्शन है जो HTML मानक में निर्दिष्ट है। जहां तक ​​मैं कह सकता हूं, यदि कोई गैर-प्राकृतिक संख्या दूसरे तर्क (जैसे '1.23') के रूप में प्रदान की जाती है, तो व्यवहार अपरिभाषित होता है, जिसका अर्थ यह है कि यह ब्राउज़र के लिए इस पर एक व्यवहार को लागू करने के लिए है। –