मेरे पास कुछ प्रसंस्करण है जो कुछ सेकंड लेने जा रहा है, इसलिए मैं प्रगति पर एक दृश्य संकेतक जोड़ना चाहता हूं।ब्राउज़र प्रतिपादन और जावास्क्रिप्ट निष्पादन की समकालिक/असीमित प्रकृति
.processing
{
background-color: #ff0000;
}
<div id="mydiv">
Processing
</div>
स्क्रिप्ट:
$("#mydiv").addClass("processing");
// Do some long running processing
$("#mydiv").removeClass("processing");
मैं naively सोचा था कि वर्ग div पर लागू किया जाएगा और UI को अपडेट किया जाएगा। हालांकि, ब्राउज़र में इसे चलाने (फ़ायरफ़ॉक्स में कम से कम) div को कभी भी हाइलाइट नहीं किया जाता है। क्या कोई मुझे समझा सकता है कि मेरा div क्यों हाइलाइट नहीं हुआ? वर्ग जोड़ा जाता है, प्रसंस्करण होता है और फिर वर्ग हटा दिया जाता है; UI को बीच में अपडेट नहीं किया गया है और उपयोगकर्ता लाल पृष्ठभूमि को कभी नहीं देखता है।
मुझे पता है कि जेएस एकल-थ्रेडेड है लेकिन मुझे हमेशा लगता है कि ब्राउजर प्रतिपादन डीओएम अपडेट होने पर समकालिक रूप से चलाएगा। क्या मेरी धारणा गलत है?
और सबसे महत्वपूर्ण बात यह है कि इस प्रभाव को प्राप्त करने के लिए अनुशंसित तरीका क्या है? धीमी प्रसंस्करण एसिंक्रोनस बनाने और कॉलबैक के साथ काम करने के लिए मुझे setTimeout
का उपयोग करने का नतीजा है? एक बेहतर तरीका होना चाहिए क्योंकि मुझे वास्तव में यहां एसिंक व्यवहार की आवश्यकता नहीं है; मैं सिर्फ यूआई को रीफ्रेश करना चाहता हूं।
संपादित करें:
JSFiddle: http://jsfiddle.net/SE8wD/5/
मेरा मानना है कि इस तरह के परिवर्तन सीधे इसे डोम पर लाएंगे, लेकिन ब्राउजर तब तक इंतजार करेगा जब तक कि कोई भी पुनर्भुगतान करने से पहले जावास्क्रिप्ट निष्पादन "निष्क्रिय" न हो। – pimvdb
"कुछ लंबी चल रही प्रसंस्करण करें" में कुछ असीमित कॉल है? (AJAX, settimeout आदि) –
मैं वास्तव में नहीं देख सकता कि आपका कोड कहां गलत है, क्योंकि यह आपके द्वारा पोस्ट की गई चीज़ों के ठीक लगता है। शायद आपकी बाहरी सीएसएस फ़ाइल में कुछ 'महत्वपूर्ण' है। क्या आप वाकई कक्षा में शामिल हो गए हैं (क्या आपने फ़ायरबग के माध्यम से इसका निरीक्षण किया है) और क्या प्रक्रिया वास्तव में उस समय तक ले जाती है? हो सकता है कि यह बहुत तेज़ होता है –