使用jquery动态加载Js文件和Css文件

2019-09-04 作者:计算机教程   |   浏览(116)

如果你有很多关联的CSS文件要一起加载,或者想动态的加载不同的CSS文件,那么下面的方法你一定对你有帮助。
Jquery动态加载Js和Css扩展方法

在介绍ensure内部的实现之前,让我们先来看看其功能:

$.extend({ 
   includePath: '', 
   include: function(file) { 
    var files = typeof file == "string" ? [file]:file; 
    for (var i = 0; i < files.length; i  ) { 
      var name = files[i].replace(/^s|s$/g, ""); 
      var att = name.split('.'); 
      var ext = att[att.length - 1].toLowerCase(); 
      var isCSS = ext == "css"; 
      var tag = isCSS ? "link" : "script"; 
      var attr = isCSS ? " type='text/css' rel='stylesheet' " : " language='javascript' type='text/javascript' "; 
      var link = (isCSS ? "href" : "src")   "='"   $.includePath   name   "'"; 
      if ($(tag   "["   link   "]").length == 0) document.write("<"   tag   attr   link   "></"   tag   ">"); 
    } 
  } 
}); 

ensure({
html: "popup.html",
javascript: "popup.js",
css: "popup.css"
}, function() {
Popup.show("hello world");
}
);
在这段代码中,ensure首先会确保popup.html、popup.js、popup.css这3个文件的加载,如果都没加载过ensure就会动态加载它们;如果已经加载过了,ensure不会再次加载。在确保这3个文件都加载后,ensure会调用后面的匿名函数,也就是执行Popup.show("hello world");。

使用方法:

接下来,就让我们看看ensure是如何动态加载JavaScript与CSS的。

$.include('//www.jb51.net/include/dedeajax.js'); 
$.include('//www.jb51.net/templets/skins/style/android.css'); 

加载JavaScript
在ensure当中,加载JavaScript分两种情况来执行,也就是Safari与非Safari这两种情况。

或者:

在IE、Firefox、Opera中加载JavaScript
在这三款浏览器中加载JavaScript,其实只需要创建一个script元素,把src指向要加载的URL,最后把script元素追加到head元素上,那就搞掂了。此项工作是在HttpLibrary.createScriptTag()中完成的。不过我们不仅仅要加载JavaScript,同时还需要知道它什么时候完成加载,这可以通过script元素的onload事件或onreadystatechange事件来实现。

$.includePath='www.jb51.net/html/'; 
$.include([dedeajax.js','android.css']); 

在Safari中加载JavaScript
因为Safari 2不支持onload或者onreadystatechange,所以只能手动通过XHR把URL读去过来,然后再手动eval这段代码,这就带来了一个限制──只能加载本域的JavaScript文件。在ensure当中,eval的工作是通过HttpLibrary.globalEval()来完成的。为了让JavaScript代码在全局(global)上下文中eval,ensure还是使用了创建script元素的方法,并将要eval的JavaScript置于其内,最后把script元素追加到head元素内。

以上就是本文的全部内容,希望对大家的学习有所帮助。

细心的人肯定要问,为什么HttpLibrary.globalEval()要如此设计,而非直接window.eval或者eval.call。这是因为,window.eval和eval.call都无法在IE6中实现和script标签加载JavaScript代码一模一样的效果,这两种做法的eval在IE6下仍然不是在全局上下文中执行的。搜索一下你就会发现一些相关的讨论,例如jQuery就曾经使用window.execScript()来完成此项任务。不过最终大家都发现添加script元素才是最好的跨浏览器解决方案,所以现在的jQuery和ensure都是如此实现的了。

本文由www.2003.com发布于计算机教程,转载请注明出处:使用jquery动态加载Js文件和Css文件

关键词: