2011-07-28 17 views
2

我加載CSS如何捕捉CSS樣式的onload事件?

var ss = document.createElement("link"); 
var url = 'http://site.ru/style.css'; 
ss.setAttribute("rel", "stylesheet"); 
ss.setAttribute("type", "text/css"); 
ss.setAttribute("href", url); 
document.getElementsByTagName("head")[0].appendChild(ss); 

我想CSS加載後調用功能,但標籤鏈接沒有onload事件,是有辦法做到這一點?

+0

我無法看到AJAX的一部分。 – jAndy

+0

它不是ajax,我錯了 – Ildar

+0

是你的JavaScript在同一個域上運行? – jAndy

回答

4

您目前沒有通過Ajax加載該css內容,但您可以使用來做。這樣,當數據傳輸完成時,您也可以使用回調。在這個例子中,我使用jQuery來簡化和方便。

請注意:這隻適用於如果您的css文件位於同一個域上的您的javascript &。

$.get('http://site.ru/style.css', function(css) { 
    $('<style>', { 
     html: css 
    }).appendTo(document.head || document.getElementsByTagName('head')[0]); 
}); 

簡體香草的Javascript可能看起來像:

var req; 

try { 
    req = new XMLHttpRequest(); 
} catch (e) { 
    req = new ActiveXObject('Microsoft.XMLHTTP'); // there are plenty more 
} finally { 
    req.onreadystatechange = function() { 
     if(req.readyState === 4) { // simplified/shortened 
      var head   = document.head || document.getElementsByTagName('head')[0] || document.documentElement, 
       lnk   = document.createElement('style'); 
       lnk.type  = 'text/css'; 
       lnk.textContent = lnk.text = req.responseText; 

      head.insertBefore(lnk, head.firstChild); 
     } 
    }; 

    req.open('GET', 'http://site.ru/style.css', true); 
    req.send(null); 
} 
+0

好的答案,但我建議在這裏使用像jQuery或Prototype這樣的框架。 jQuery提供了一個簡單的「就緒」事件,可以附加到css文件。整個AJAX處理更直接。 – acme

+0

@acme:你是什麼意思?當DOM準備就緒時,'.ready()'內部偵聽的'DOMContentLoaded'事件將會觸發。樣式表和圖像可能不會在這個時候加載,另外我猜測OP想要在pageload之外動態地插入樣式表。 – jAndy

+1

...我真的*很感興趣,爲什麼有人會匿名downvote這個答案。哦,天哪;) – jAndy