2009-08-03 14 views
8

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

सरल सार परिदृश्य की कल्पना कीजिए, अगर आप जावास्क्रिप्ट समर्थन अलग ढंग से कुछ प्रदर्शित करना चाहते हैं .. यह आम तौर पर मैं क्या कर रहा खत्म हो जाएगा है:

<div id="test">original</div> 
<script type="text/javascript"> 
    var t = document.getElementById('test'); 
    t.innerHTML = 'changed'; 
</script> 

कई दावा कर सकते हैं आप एक रूपरेखा का उपयोग करें और इंतजार करना चाहिए एक डोमरेड इवेंट के लिए, और वहां परिवर्तन करें .. हालांकि वहां एक महत्वपूर्ण देरी है जहां दस्तावेज़ के अंत से पहले 'टेस्ट' तत्व पहले से ही प्रस्तुत किया जा चुका है और सीएसएस तैयार है और एक घरेलू ट्रिगर है .. इस प्रकार एक उल्लेखनीय झिलमिलाहट 'मूल' का।

क्या यह कोड दौड़ की स्थिति विफलताओं के लिए उत्तरदायी है? या क्या मैं guarentee कर सकता हूं कि एक तत्व स्क्रिप्ट से पहले मौजूद होने पर खोजने योग्य और संशोधित है?

अग्रिम धन्यवाद।

उत्तर

5

आप कर सकते हैं, लेकिन इसके आसपास के मुद्दे हैं।

आईई में अगर आप बंद न किए गए नोड में हेरफेर करने का प्रयास करते हैं (उदाहरण के लिए बॉडी अपने करीबी टैग से पहले जो आपके जेएस के नीचे होना चाहिए) तो आप आईई की "ऑपरेशन एबॉर्टेड" त्रुटि का सामना कर सकते हैं जिसके परिणामस्वरूप खाली पेज। नोड के मैनिपुलेशन में नोड्स, मूविंग नोड्स इत्यादि शामिल हैं।

अन्य ब्राउज़रों में व्यवहार अपरिभाषित है, हालांकि वे आमतौर पर व्यवहार करते हैं जैसा आप उम्मीद करेंगे। मुख्य मुद्दा यह है कि जैसे ही आपका पृष्ठ विकसित होता है, पृष्ठ अलग-अलग लोड/पार्स/चला सकता है। इससे ब्राउज़र को परिभाषित करने से पहले कुछ स्क्रिप्ट चलने का कारण बन सकता है संदर्भित तत्व वास्तव में बनाए गए हैं और डीओएम मैनिपुलेशन के लिए उपलब्ध कराए गए हैं।

यदि आप अपने उपयोगकर्ता को कथित प्रदर्शन (यानी स्नैपनेस) को बढ़ाने का प्रयास कर रहे हैं। मैं अत्यधिक सुझाव देता हूं कि आप इस पथ से बचें और अपने पृष्ठों को हल्का करने में देखें। शुरू करने में आपकी सहायता के लिए आप याहू के वाईएसलो/Google के पेज परफॉर्मेंस फ़ायरबग का उपयोग कर सकते हैं।

Google's Page Speed

Yahoo's YSlow

+0

हाय रायगैक्स, हाँ, मैं ऑपरेशन निरस्त मुद्दे को पूरी तरह से बदल सकता हूं जो बदलते तत्वों के साथ बंद हो गया है .. स्नैपनेस के मामले में, ये पृष्ठ हल्के हैं, वास्तविक पृष्ठ 15kb है .. हालांकि मेरे बदले गए तत्व शुरुआती बॉडी टैग के ठीक नीचे हो सकता है, और यह मेरे पृष्ठ को कितना प्रकाश दे रहा है, इस पर ध्यान दिए बिना, यह पहले से ही आग से पहले प्रस्तुत करेगा .. मैं एक मैला अनुभव से बचने की कोशिश कर रहा हूं यह हमेशा डोमरेड के साथ आईएमओ अनुभव करता है और इस तरह की चीजें करता है। – meandmycode

+0

अंधेरे युग में वापस, जब हमारे पास डोमरेडी पर आग लगाने के लिए एक क्रॉस-ब्राउजर तरीका नहीं था, तो हम ऑनलोड का उपयोग करते थे, जिसे सभी छवियों/सीएसएस/आदि के बाद निकाल दिया गया था और प्रस्तुत किया गया था। अब हमारे पास डोमरेडी है जो डीओएम को पार्स और प्रतिनिधित्व के बाद आग लगती है, लेकिन संभावित रूप से छवियों/आदि से पहले। यह भी अपेक्षाकृत नई प्रगति है। तो OnDomReady की प्रतीक्षा हमारे पास इस बिंदु पर है और यह मजबूती के लिए सबसे अच्छा समाधान है। यदि आप मानते हैं कि डॉमरेडी से पहले आपका हेरफेर इसके लायक है और आप संलग्न नोड्स में नोड्स को जोड़/बनाने/स्थानांतरित नहीं कर रहे हैं तो आप शायद ठीक हैं। –

+0

ग्रेट, यह निश्चित रूप से इसके लायक है अगर यह काम करता है .. जो मैं सुन रहा हूं, उससे ठीक काम करना चाहिए, लेकिन कुछ भी आधिकारिक तौर पर यह नहीं बताता कि एक तत्व अपने बंद नोड के बाद तैयार होना चाहिए। – meandmycode

3

आप पूर्ण रूप से लोड होने से पहले डीओएम में हेरफेर कर सकते हैं, लेकिन यह जोखिम भरा हो सकता है। आप स्पष्ट रूप से गारंटी नहीं दे सकते कि आप जिस डोम को मैनिपुलेट करने की कोशिश कर रहे हैं उसका बिट वास्तव में अभी तक मौजूद है, इसलिए आपका कोड अंतःस्थापित हो सकता है।

+0

धन्यवाद rikh IE 5 और नेविगेटर में अपवाद फेंकता है, कि आज अस्तित्व क्या आप थेरेस कोई गारंटी नहीं है, मतलब है विनिर्देश द्वारा या उत्पादों की वास्तविक हकीकत द्वारा: यह इस तरह दिखता है (एफएफ, यानी, ओपेरा इत्यादि) .. मुझे लगता है कि पार्सर रैखिक रूप से कार्य करता है और तत्व जोड़ता है क्योंकि यह उनके बंद नोड का सामना करता है ..हालांकि यह एक विनिर्देश नहीं हो सकता है, मुझे लगता है कि यह एक समझदार व्यवहार है, और यह जवाब है कि यह जवाब है कि यह मामला अधिकृत है। – meandmycode

+1

ईमानदार होने के लिए, मुझे नहीं पता, लेकिन ऐसा कुछ नहीं है जिसे मैं निर्भर करना चाहता हूं। यदि आप गलत जानकारी प्रदर्शित होने के बारे में चिंतित हैं, तो शुरुआत में कुछ भी प्रदर्शित करने का प्रयास करें, और उसके बाद दस्तावेज़ तैयार करने में कुछ भरें, या बस सिस्टम से समस्या को डिज़ाइन करें, इसलिए आपको जो भी पूछ रहा है उसे करने की आवश्यकता नहीं है। –

+0

दुर्भाग्य से यह संभव नहीं है, मेरे पास आखिरी उदाहरण है जहां हम हाइपरलिंक्स के रूप में पेजिनेशन संख्याएं प्रस्तुत करते हैं, और हमारी जावास्क्रिप्ट चलता है और इन्हें बदलता है ताकि हम 'वाई का पेज एक्स' प्रदर्शित कर सकें और पेज हाइपरलिंक को सक्रिय कर सकें जो कि सक्रिय है (पेज हैं एंकर) .. यह एक सामान्य प्रगतिशील वृद्धि परिदृश्य है जहां हम कुछ ऐसा प्रस्तुत करते हैं जो जावास्क्रिप्ट के बिना काम करेगा .. और उसके बाद जावास्क्रिप्ट का उपयोग करने के लिए जावास्क्रिप्ट के साथ इसे रोकें और संशोधित करें .. तथ्य यह है कि आप जावास्क्रिप्ट के साथ इसे कुशल बना सकते हैं और फिर आपको साबित कर सकते हैं। जावास्क्रिप्ट समर्थन है;) – meandmycode

1

जब तक आप केवल नोड्स जो स्क्रिप्ट ब्लॉक का होना संशोधित रूप में (यानी नोड के बंद टैग स्क्रिप्ट के खुलने वाला टैग पहले लागू), आप किसी भी समस्याओं का सामना नहीं करना चाहिए।

यदि आप यह सुनिश्चित करना चाहते हैं कि ऑपरेशन सफल हो जाए, तो try...catch ब्लॉक में कोड को लपेटें और विफलता पर setTimeout() के माध्यम से इसे फिर से कॉल करें।

+0

धन्यवाद क्रिस्टोफ, मैं इस बात पर विचार कर रहा था कि विफलता पर मुझे कुछ भी वापस या अपवाद नहीं मिलेगा और पुनः प्रयास कर सकता था .. हालांकि मुझे इस तरह के पुनः प्रयास तर्क का शौक नहीं है, मुझे चिंता है कि निष्पादन पेज लोडिंग प्रदर्शन में बाधा डाल सकता है .. मैं हूं यह देखने के लिए कि क्या मैं अत्यधिक बाध्य बैंडविड्थ और यहां तक ​​कि कम प्रसंस्करण शक्ति को अनुकरण करने की कोशिश करके कुछ परीक्षण चला सकता हूं यह देखने के लिए कि क्या मैं मौजूद किसी भी विंडो को ढूंढ सकता हूं .. अब तक बैंडविड्थ कुछ भी नहीं दिख रहा है, मैं पुनरावृत्तियों चला रहा हूं 100 बाइट्स पर एक सेकंड लोड हो रहा है (इसमें थोड़ी देर लगती है) .. और जब तक क्षेत्र लोड हो गया है, यह पहले से ही ... – meandmycode

+0

.. स्क्रिप्ट को पूरी तरह से ठीक से निष्पादित किया गया .. मुझे लगता है कि प्रोसेसिंग समय को बाधित करने की अधिक संभावना है पार्सर को अपंग करें और किसी भी खिड़कियों को उजागर करें जहां धारणा गलत है। – meandmycode

0

Viajeros.com में मेरे पास लोडिंग सूचक 8-9 महीने से काम कर रहा है और मुझे अब तक कोई समस्या नहीं है।

<body> 

<script type="text/javascript"> 
    try { 
     document.write('<div id="cargando"><p>Cargando...<\/p><\/div>'); 
     document.getElementById("cargando").style.display = "block"; 
    } catch(E) {}; 
</script> 
+2

शायद यह सब कोड नहीं है, लेकिन आपको एहसास है कि 'getElementById' पूरी तरह से अनावश्यक है, है ना? आप केवल 'style = "डिस्प्ले जोड़ सकते हैं: HTML पर" "ब्लॉक करें। – DisgruntledGoat

-1

एक्सेस करना डोम समय से पहले ही 4.

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