19

I'm trying to create a page theme function for my site. I want to load the corresponding themes dynamically on the page using separate CSS files.

I'm using this code:

 fileref.setAttribute("rel", "stylesheet")
 fileref.setAttribute("type", "text/css")
 fileref.setAttribute("href", 'link.css')
 document.getElementsByTagName("head")[0].appendChild(fileref)

Which works fine, but it doesn't return any info if the CSS file has loaded or not.

Is there a way to catch when the .css is loaded? Maybe by using ajax?

Yi Jiang
50.2k16 gold badges139 silver badges137 bronze badges
asked Sep 19, 2010 at 2:08
1

1 Answer 1

20

Internet Explorer will trigger an onReadyStateChange event when CSS file is loaded (or any other change in it's readyState). Other browsers do not trigger any event, so you will have to manually check if the stylesheet has been loaded, which is easily possible by checking the document.styleSheets object at a fixed interval.

Example

window.onload = function (){
 var filename = "link.css",sheet,i;
 var fileref = document.createElement("link");
 fileref.setAttribute("rel", "stylesheet");
 fileref.setAttribute("type", "text/css");
 fileref.setAttribute("href", filename);
 readyfunc = function () {
 alert("File Loaded");
 }
 timerfunc = function (){
 for (i=0;i<document.styleSheets.length;i++){
 sheet = document.styleSheets[i].href;
 if(sheet !== null && sheet.substr(sheet.length-filename.length) == filename)
 return readyfunc();
 }
 setTimeout(timerfunc,50); 
 }
 if (document.all){ //Uses onreadystatechange for Internet Explorer
 fileref.attachEvent('onreadystatechange',function() {
 if(fileref.readyState == 'complete' || fileref.readyState == 'loaded')
 readyfunc();
 });
 } else { //Checks if the stylesheet has been loaded every 50 ms for others
 setTimeout(timerfunc,50);
 }
 document.getElementsByTagName("head")[0].appendChild(fileref); 
}

It's ugly, but it works in all browsers.

Joseph
120k31 gold badges186 silver badges238 bronze badges
answered Sep 19, 2010 at 3:25
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks! Haha, you're right about it being ugly, but it does the job.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.