网页设计学习笔记

HTML,CSS,JavaScript

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::

类似于动态加载 JS 文件的情形,动态加载 CSS 文件也是可以的,例如:

var loadStyles = function(url) {
var link = document.createElement("link");
link.rel = "stylesheet";
link.type = "text/css";
link.href = url;
var head = document.getElementsByTagName("head")[0];
head.appendChild(link);
};

如果需要判断何时 CSS 文件已经载入完毕,则需要用到 onload 事件,但是,这个事件不是所有浏览器都支持。具体来说,IE 和 Opera 很早就支持这个事件,而 Firefox 从 9.0 版本开始支持这个事件。至于基于 WebKit 核心的 Chrome 和 Safari 浏览器,很快也会支持这个事件的(Chrome 是从 19.0 版本开始,而 Safari 尚且未知),因为在 WebKit 中这个功能已经实现了。

如果需要动态改变 CSS 文件,例如实现网页的换肤功能,则需要稍微修改代码。假定不同的皮肤对应不同的 css 文件,可以用下面的代码:

var loadStyles = function(url, id) {
  if (id) {
    var link = document.getElementById(id);
    if (link) {
      link.href = url;
      return;
    }
  }
  var link = document.createElement("link");
  link.rel = "stylesheet";
  link.type = "text/css";
  if (id) link.id = id;
  link.href = url;
  var head = document.getElementsByTagName("head")[0];
  head.appendChild(link);
};

// use skin1
loadStyles("skin1.css", "skin-id");
// change to skin2
loadStyles("skin2.css", "skin-id");

如果 CSS 文件名没有变化,但内容改变了,需要重新载入。则可以修改文件路径的查询字符串,以迫使浏览器重新载入。代码如下:

var reloadStyles = function(id) {
  var link = document.getElementById(id); 
  var query = "?reload=" + new Date().getTime();
  link.href = link.href.replace(/\?.*|$/, query);
};

参考资料:
[1] javascript创建css、js,onload触发callback兼容主流浏览器的实现
[2] Faking Onload for Link Elements
[3] link - Mozilla Developer Network
[4] Bug 38995: style element and link element for CSS stylesheet
[5] How to prevent race conditions when loading CSS
[6] 如何动态加载 JavaScript 与 CSS
[7] Loading CSS with Javascript – and getting an onload callback
[8] CSS auto-reload
[9] Is there an easy way to reload css without reloading the page?

posted on 2012-04-06 15:03  zoho  阅读(403)  评论(0编辑  收藏  举报