2011-11-09 14 views
11

मैं जावास्क्रिप्ट का उपयोग करके एक सीएसएस स्टाइलशीट नियम गतिशील रूप से जोड़ने की कोशिश कर रहा हूं, उदाहरण के लिए 2 hereदस्तावेज़ में स्टाइलशीट कब जोड़ा गया है। स्टाइलशीट

यह समय के सबसे अधिक काम करता है, लेकिन वहाँ एक दौड़ हालत उस में (कम से कम) क्रोम (15.0.874 और 17.0.933) कभी कभी असफल करता है कि हो रहा है। कैश खाली होने पर यह अक्सर होता है (या साफ़ कर दिया गया है)।

यहाँ है कि मैं क्या करने के लिए उसे संक्षिप्त कर लिया है। सबसे पहले मैं इसे <head> पर जोड़कर बाहरी स्टाइलशीट लोड करता हूं और फिर मैं एक नई स्टाइलशीट बनाता हूं (जहां मैं नियम जोड़ूंगा)। मैं फिर document.styleSheets (तुरंत और 1 सेकंड के बाद) की लंबाई मुद्रित करता हूं।

$(function() { 
    // it doesn't happen if this line is missing. 
    $("head").append('<link rel="stylesheet" type="text/css"'+ 
        'href="/css/normalize.css" />'); 

    var stylesheet = document.createElement("style"); 
    stylesheet.setAttribute("type", "text/css"); 
    document.getElementsByTagName('head')[0].appendChild(stylesheet); 

    var b = $('body'); 
    b.append(document.styleSheets.length).append('<br/>'); 
    setTimeout(function() { 
     b.append(document.styleSheets.length).append('<br/>'); 
    }, 1000); 
}); 

(http://jsfiddle.net/amirshim/gAYzY/13/ पर इसके साथ खेलते हैं)

जब कैश स्पष्ट है, यह कभी कभी प्रिंट 2 तो 4, यह अर्थ शैली दोनों में से किसी को नहीं जोड़ता है (jsfiddle यह खुद 2 सीएसएस फ़ाइलों है कहते हैं) चादरें document.styleSheets पर तुरंत ... लेकिन शायद बाहरी फ़ाइल को लोड करने की प्रतीक्षा कर रही है।

क्या यह उम्मीद है?

यदि हां, तो Example 2 on MDN (और कई अन्य वहाँ बाहर) है टूट? रेखा 27 के बाद से:

var s = document.styleSheets[document.styleSheets.length - 1]; 

साथ document.styleSheets.length == 0

नोट का मूल्यांकन हो सकता है कि ऐसा नहीं होता है जब मैं बाह्य CSS फ़ाइल के पहले लोड न करें।

+1

मैं आपसे पूछना चाहता हूं कि आपका वांछित अंत परिणाम क्या है। किस परिस्थिति में आप एक सीएसएस फ़ाइल में एक नियम को 'इंजेक्ट' करना चाहते हैं, बस इसे सीएसएस फ़ाइल के अंदर पहली जगह लिखा है? – Sotkra

+0

मैं भी ... लेकिन केवल $ (दस्तावेज़) के बाद गतिशील स्टाइलशीट जोड़ रहा .ready निकाल दिया गया है ... –

+1

@Kees: कोड मैं दे दी है में '$ (दस्तावेज़) .ready' सब कुछ कर रही है। यही है '$ (फ़ंक्शन() {...});' करता है। – Amir

उत्तर

4

यदि जावास्क्रिप्ट सीएसएस के नीचे वाले पृष्ठ में है (जो यह लगभग हमेशा होता है) तो HTML पार्सर को जेएस निष्पादन के साथ प्रतीक्षा करनी चाहिए जब तक कि जेएस और सीएसएस पूरी तरह से लोड नहीं हो जाता है और इस तथ्य के कारण पार्स किया जाता है कि जेएस स्टाइलिंग जानकारी का अनुरोध कर सकता है (क्रोम केवल तभी ऐसा होता है जब स्क्रिप्ट वास्तव में ऐसा करता है)। यह प्रभावी रूप से लगभग सभी मामलों में बाहरी सीएसएस अवरुद्ध करने की लोडिंग बनाता है। जब आप उन्हें बाद में जावास्क्रिप्ट के माध्यम से सम्मिलित करते हैं या पृष्ठ में कोई जेएस नहीं है (या जेएस को गैर-अवरुद्ध किया जाता है) सीएसएस लोड असीमित रूप से अर्थ है कि उन्हें लोड किया गया है और डीओएम की पार्सिंग को अवरुद्ध किए बिना पार्स किया गया है। दस्तावेजों के लिए। स्टाइलशीट गिनती केवल डीओएम के अंदर शीट के बाद अपडेट हो जाती है और यह पूरी तरह से लोड होने और पार्स होने के बाद ही होती है।

इस स्थिति में वहाँ कुछ समय शामिल मतभेद हो सकता है। ध्यान में रखते हुए अधिकांश ब्राउज़रों केवल पाइप के माध्यम से वे डेटा लोड की एक सीमित संख्या (कुछ केवल दो IE6 की तरह है, सबसे 6 है और कुछ भी 12 IE9 की तरह है) स्टाइलशीट की लोडिंग कतार के अंत में जोड़ा जाता है होना जरूरी लदा हुआ। ब्राउज़र अभी भी चीजें लोड कर रहा है क्योंकि आप DOMReady पर फ़ंक्शन करते हैं। स्टाइलशीट में कौन से नतीजे पूरी तरह से लोड नहीं हो रहे हैं और एक सेकंड बाद पार्स किए गए हैं, इसलिए दस्तावेज़ को प्रभावित नहीं करते हैं। स्टाइलशीट्स। लम्बाई।

और यह सब स्टाइलशीट उदाहरण मैं वेब पर आई है डोम मान पूरी तरह से पार्स और भरी हुई है। ऑफडोम स्टाइलशीट नियमों को डालने या चेक करने की इजाजत नहीं देता है क्योंकि उनके पास @import नियम हो सकते हैं और उन्हें बाहरी रूप से लोड किया जाना चाहिए, इसलिए ब्राउज़र के लिए यह निर्धारित करना मुश्किल है कि जब तक शीट के साथ बातचीत करने के लिए सुरक्षित हो वे पूरी तरह से लोड और पार्स कर रहे हैं। ऑफडोम स्टाइलशीट एक खाली शीट संपत्ति का पर्दाफाश करती है लेकिन जब तक डीओएम में शीट को जोड़ा नहीं जाता है तब तक आप इसके साथ बातचीत नहीं करेंगे।

मुझे हमेशा स्टाइलशीट को गतिशील रूप से डालने और उस शीट में सभी परिवर्तनों को निष्पादित करने और दस्तावेज़ छोड़ने के लिए बेहतर पाया गया है। स्टाइलशीट अकेले। यह एक बड़ा फायदा है कि जब आप समान विशिष्टता वाले शैलियों को ओवरराइड करते हैं तो आप गलत शीट में सम्मिलन के कारण परेशानी में भाग नहीं लेते हैं। दस्तावेज़ के बाद से। स्टाइलशीट्स एक लाइव नोडलिस्ट है, document.stylesheets [2] हर बार जब आप फ़ंक्शन को कॉल करते हैं (जब तक एक var में संग्रहीत नहीं किया जाता है) एक और शीट इंगित कर सकता है। तो मैं एक गतिशील रूप से सम्मिलित शीट का उपयोग करता हूं और केवल उस पर काम करता हूं।

1

यह मदद करनी चाहिए: 'When is a stylesheet really loaded'

'उदाहरण 2' का सवाल है। यदि आप Chrome में हैं, तो addStylesheetRules() को कॉल करते समय स्टाइलशीट लोडिंग होने पर यह टूट जाएगा।

+1

पर एक नज़र डालें तो उदाहरण 2 हमेशा काम नहीं करता है। यानी यदि मैं (या अन्य जेएस लाइब्रेरी) ने 'addStylesheetRules() 'को कॉल करने से पहले एक बाहरी स्टाइलशीट जोड़ा है। – Amir

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