2013-01-16 13 views
5

जावास्क्रिप्ट समारोह चल रहा है जब मान लीजिए कि मैं इस जावास्क्रिप्ट समारोह करते हैं:सीएसएस एनिमेशन रोकने

function pauseComp(ms) { 
    var date = new Date(); 
    var curDate = null; 
    do { curDate = new Date(); } 
    while(curDate-date < ms); 
    } 

और एक css3 एनीमेशन (उदाहरण के लिए, <i class="icon-spinner icon-spin"></i> नई font-awesome 3 से)। जब मैं उपरोक्त जावास्क्रिप्ट फ़ंक्शन चलाता हूं, तो फ़ंक्शन चलने पर स्पिनर बंद हो जाता है। देखें कि मैं here के बारे में क्या बात कर रहा हूं। असल में, जावास्क्रिप्ट सीएसएस एनिमेशन को रोकता है, और मैं सोच रहा हूं कि क्यों, या अगर किसी और ने यह देखा है/एक कामकाज मिला है। मैंने इसे एक सेटटाइमआउट (एफएन, 0) में डालने की कोशिश की है, जहां एफएन लंबी प्रक्रिया है, लेकिन फिर एहसास हुआ कि यह क्यों काम नहीं करेगा (जेएस बहुसंख्यक नहीं है)। किसी ने यह देखा है?

अद्यतन: दिलचस्प बात यह है कि ऐसा लगता है कि सफारी में यह कोई समस्या नहीं है, हालांकि ब्राउज़र इंटरफ़ेस के साथ बातचीत अभी भी प्रभावित हो रही है।

+0

आपको अपने "लंबे समय तक चलने वाले कोड" को टुकड़ों में तोड़ने की आवश्यकता होगी ताकि बाकी सब कुछ जारी रहे। –

+0

ठीक है, हालांकि मुझे पता है कि यह इसे ठीक करेगा, यह उन कार्यों के लिए व्यवहार्य समाधान नहीं है जिन्हें मैं इसे लागू करने का प्रयास कर रहा हूं। कार्य छोटे हिस्सों में टूटने योग्य नहीं हैं। मैं वास्तव में यह देखने के लिए जांच कर रहा हूं कि किसी के पास उपरोक्त सटीक समस्या का समाधान है, वैसे ही, तोड़ा नहीं जा सकता है। –

उत्तर

5

एक ब्राउज़र पृष्ठ एकल थ्रेडेड है। यूआई को अपडेट करना आपके जावास्क्रिप्ट प्रोग्राम के समान थ्रेड पर होता है। जिसका अर्थ यह भी है कि जावास्क्रिप्ट कोड निष्पादित होने पर कोई भी एनीमेशन नए फ्रेम नहीं खींचागा। आम तौर पर, यह कोई बड़ा सौदा नहीं है क्योंकि अधिकांश जेएस कोड को एक ही एनीमेशन फ्रेम से तेज़ी से निष्पादित किया जाता है।

तो सबसे अच्छी सलाह यह है कि: ऐसा मत करो। उस लंबे समय तक जेएस इंजन को लॉक न करें। ऐसा करने के लिए एक क्लीनर तरीका चित्रित करें।


हालांकि, यदि आपको चाहिए, तो एक तरीका है। आप HTML5's Web Workers API के माध्यम से एक अतिरिक्त धागा प्राप्त कर सकते हैं। यह पुराने ब्राउज़र में समर्थित नहीं है, लेकिन यह आपको मुख्य वेबपृष्ठ से और अपने स्वयं के धागे में कुछ लंबे समय तक चलने वाले CPU चूसने कोड को चलाने की अनुमति देगा, और फिर इसे पूरा होने पर आपके पृष्ठ पर कुछ परिणाम पोस्ट कर देगा।

+0

हां, मैंने वेब श्रमिकों को देखा है। क्या आपको पता है कि वेब श्रमिकों के पास डोम तक पहुंच है या नहीं? क्योंकि मेरी लंबी चल रही प्रक्रिया jQuery में होने वाले सभी डोम अपडेट हैं, और यही धीमा है। –

+0

@ क्रिस्टियन बैंककेस्टर वेब वर्कर्स डीओएम तक नहीं पहुंच सकते हैं। आपको 'setTimeout' का उपयोग करना होगा। – bfavaretto

+0

आह, मैंने सेटटाइमआउट का उपयोग करने का प्रयास किया है, जो काम नहीं करता है। यह अद्यतन jsfiddle देखें: http://jsfiddle.net/JU4St/2/ –

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