प्रश्न का शीर्षक मुझे बताता है कि मेरे विशेष मामले के पीछे क्या अंतिम सवाल है।बल पर जावास्क्रिप्ट के साथ डीओएम रीड्रा
मेरा मामला: एक क्लिक हैंडलर के अंदर, मैं एक व्यस्त कार्य शुरू होने से ठीक पहले एक छवि दृश्यमान (एक 'लोडिंग' एनीमेशन) बनाना चाहता हूं। फिर मैं समारोह पूरा होने के बाद इसे फिर से अदृश्य बनाना चाहता हूं। मुझे उम्मीद की बजाय मुझे एहसास हुआ कि छवि कभी दिखाई नहीं दे रही है। मुझे लगता है कि यह ब्राउज़र के कारण हैंडलर को समाप्त करने की प्रतीक्षा कर रहा है, इससे पहले कि यह कोई भी रेड्रॉइंग कर सके (मुझे यकीन है कि उसके लिए अच्छे प्रदर्शन कारण हैं)।
कोड (भी इस बेला में: http://jsfiddle.net/JLmh4/2/)
एचटीएमएल:
<img id="kitty" src="http://placekitten.com/50/50" style="display:none">
<div><a href="#" id="enlace">click to see the cat</a> </div>
js:
$(document).ready(function(){
$('#enlace').click(function(){
var kitty = $('#kitty');
kitty.css('display','block');
// see: http://unixpapa.com/js/sleep.html
function sleepStupidly(usec)
{
var endtime= new Date().getTime() + usec;
while (new Date().getTime() < endtime)
;
}
// simulates bussy proccess, calling some function...
sleepStupidly(4000);
// when this triggers the img style do refresh!
// but not before
alert('now you do see it');
kitty.css('display','none');
});
});
मैं sleepStupidly
समारोह है कि दिखाने के लिए सही होने के बाद alert
कॉल जोड़ लिया है बाकी के पल में, ब्राउज़र फिर से चलाता है, लेकिन पहले नहीं। मुझे 'डिस्प्ले' को 'ब्लॉक' पर सेट करने के बाद सही ढंग से फिर से निकालने की उम्मीद थी;
रिकॉर्ड के लिए, मैंने इस कोड में दिखाए गए और छिपाने वाली छवि के बजाय HTML टैग, या सीएसएस कक्षाओं को स्वैप करने का भी प्रयास किया है। वही परिणाम
मेरे सभी शोध के बाद मुझे लगता है कि मुझे क्या चाहिए, ब्राउज़र को को फिर से निकालने के लिए मजबूर करने की क्षमता है और तब तक हर दूसरी चीज़ को रोकें।
क्या यह संभव है? क्या यह एक क्रॉसब्रोसर तरीके से संभव है? कुछ प्लगइन मैं शायद खोजने में सक्षम नहीं था ...?
मैंने सोचा कि शायद 'jquery css callback' जैसे कुछ (जैसा कि इस प्रश्न में: In JQuery, Is it possible to get callback function after setting new css rule?) चाल करेगा ... लेकिन यह अस्तित्व में नहीं है।
मैंने एक ही घटना के लिए अलग-अलग हैंडलर में दिखाए जाने, फ़ंक्शन कॉल और छिपाने की भी कोशिश की है ... लेकिन कुछ भी नहीं। फ़ंक्शन के निष्पादन में देरी के लिए setTimeout
भी जोड़ना (जैसा कि यहां अनुशंसित है: Force DOM refresh in JavaScript)।
धन्यवाद और मुझे आशा है कि यह दूसरों की भी मदद करेगी।
Javier
संपादित करें (मेरे पसंदीदा जवाब सेट करने के बाद):
बस आगे समझाने के लिए कारण है कि मैं window.setTimeout रणनीति का चयन किया। मेरे वास्तविक उपयोग मामले में मुझे एहसास हुआ है कि पृष्ठ को फिर से निकालने के लिए पर्याप्त समय देने के लिए, मुझे इसे लगभग 1000 मिलीसेकंड (बेवकूफ उदाहरण के लिए 50 से अधिक) देना था। यह मेरा मानना है कि एक गहरे डोम पेड़ (वास्तव में, अनावश्यक रूप से गहरा) के कारण है। सेटटाइमआउट दृष्टिकोण आपको ऐसा करने देता है।
'window.setTimeout() 'सहायता नहीं थी? –
लंबी टाइमआउट देरी का उपयोग करने के लिए इसकी आवश्यकता नहीं होनी चाहिए। आपको जो चाहिए वह शायद आपकी छवि को तुरंत लोड करने में सक्षम होने के लिए प्रीलोड करें। –
मैं देखता हूं। लेकिन मैं समझता हूं कि अगर मामला ब्राउजर द्वारा शुरू से लोड नहीं किया गया था तो यह मामला होगा (यह उचित होगा क्योंकि यह 'डिस्प्ले' है: कोई नहीं, मुझे लगता है)। यह मामला नहीं है, कम से कम क्रोम के साथ जो बहुत शुरुआत से छवि लोड करता है (डेवलपर टूल के साथ देखा जाता है)। मुझे अभी भी लगता है कि विरासत मार्कअप के कारण मैं काम कर रहा हूं (बहुत सी एम्बेडेड टेबल, वास्तव में ... मुझ पर निर्भर नहीं है!)। दरअसल फ़ायरफ़ॉक्स बेहतर होता है ('कम समय' की आवश्यकता होती है) ... क्या यह समझ में आता है? एक बार फिर धन्यवाद। – javigzz