A-A+
javascript include/import 动态加载js/css文件方法总结
在javascript中没有像php中可以使用include加载文件,这里我们需要自己定义一些方法,下面总结了关于javascript include/import 动态加载js/css文件方法有需要的同学可参考本文章。
第一种:一般用在外部CSS文件中加载必须的文件,程序代码如下:
@import url(style.css);
只能用在CSS文件中或者style标签中.
第二种:简单的在页面中加载一个外部CSS文件,程序代码如下:
document.createStyleSheet(cssFile);
第三种:用createElement方法创建CSS的Link标签,程序代码如下:
- var head = document.getElementsByTagName('HEAD').item(0);
- var style = document.createElement('link');
- style.href = 'style.css';
- style.rel = 'stylesheet';
- style.type = 'text/css';
- head.appendChild(style);
这里贴上我以前在项目中使用的几个函数,希望对大家有用,程序代码如下:
- function loadJs(file){
- var scriptTag = document.getElementById('loadScript');
- var head = document.getElementsByTagName('head').item(0);
- if(scriptTag) head.removeChild(scriptTag);
- script = document.createElement('script');
- script.src = "../js/mi_"+file+".js";
- script.type = 'text/javascript';
- script.id = 'loadScript';
- head.appendChild(script);
- }
- function loadCss(file){
- var cssTag = document.getElementById('loadCss');
- var head = document.getElementsByTagName('head').item(0);
- if(cssTag) head.removeChild(cssTag);
- css = document.createElement('link');
- css.href = "../css/mi_"+file+".css";
- css.rel = 'stylesheet';
- css.type = 'text/css';
- css.id = 'loadCss';
- head.appendChild(css);
- }
使用JS动态在页面加载CSS文件
刚刚在写随笔的时候发现cnblogs好像将自己在文章的HTML里定义的CSS(例如:
- <link rel="stylesheet" type="text/css" href="xxx.css" />
都过滤掉了,记得以前自己收藏过一个JS函数,可以动态加载CSS文件,翻翻电脑果然找到了,代码贴出来,说不准在工作中也会用到呢,代码如下:
- <script language="javascript">
- function loadjscssfile(filename, filetype) {
- if (filetype == "js") {
- var fileref = document.createElement('script');
- fileref.setAttribute("type", "text/javascript");
- fileref.setAttribute("src", filename)
- } else if (filetype == "css") {
- var fileref = document.createElement("link");
- fileref.setAttribute("rel", "stylesheet");
- fileref.setAttribute("type", "text/css");
- fileref.setAttribute("href", filename)
- }
- if (typeof fileref != "undefined") document.getElementsByTagName("head")[0].appendChild(fileref)
- }
- loadjscssfile("http://news.163.com/special/0001jt/dblue.css", "css");
- </script>
一个完美的插件可动态加载js,和css
修复queued因定义为this.queued导致多个load混乱,更改参数为数组,使用方法为直接调用Util.load(),可以为每个文件添加回调,也可以添加一个全局回调,示例代码如下:
- [
- Util.load([
- ["/misc/js/content.js", function() {
- // 单个回调
- }],
- ["/misc/js/comment.js"],
- ["/misc/js/home.js"]
- ], function() {
- // 全局回调
- });
- ] [
- var Util = {
- /**
- * 全局js列表
- */
- scripts: {},
- head: document.head || document.getElementsByTagName("head")[0] || document.documentElement,
- /**
- * 异步加载js文件
- */
- load: function(queue, callback) {
- var self = this, queued = queue.length;
- for (var i = 0, l = queue.length; i < l; i++) {
- var elem;
- elem = document.createElement("script");
- elem.setAttribute("type", "text/javascript");
- elem.setAttribute("async", "async");
- elem.setAttribute("src", queue[i][0]);
- // 文件还没有处理过
- if (typeof this.scripts[elem.src] === "undefined") {
- // 使onload取得正确elem和index
- (function(elem, index) {
- elem.onload = elem.onreadystatechange = function() {
- if (! elem.readyState || /loaded|complete/.test(elem.readyState)) {
- queued--;
- // 解决IE内存泄露
- elem.onload = elem.onreadystatechange = null;
- // 释放引用
- elem = null;
- // 调用callback
- queue[index][1] && queue[index][1]();
- // 队列全部加载,调用最终callback
- if (queued === 0) {
- callback && callback();
- }
- }
- };
- })(elem, i);
- }
- // 已处理,调用callback
- else {
- queued--;
- queue[i][1] && queue[i][1]();
- }
- this.head.appendChild(elem);
- // 队列全部加载,调用最终callback
- if (queued === 0) {
- callback && callback();
- }
- }
- }
- };
- ]
使用举例,路径写法和script,link中一样就行了,第一种单个文件,带回调,代码如下:
- include("js/jquery.js", function () {
- alert("i'm callback!");
- });
第二种 多个文件.带回调,多个文件以数组的形式书写,每个文件可以单独带回调,最后一个回调将在最后一个文件加载完后调用,代码如下:
- include([
- ["js/jquery.js", function () {
- alert("i'm callback of jquery.js");
- }],
- ["js/misc.js", function () {
- alert("i'm callback of misc.js");
- }],
- ["css/style.css", function () {
- alert("i'm callback of style.css");
- }],
- ["css/index.css"]
- ], function () {
- alert("i'm the last callback!");
- });
还有些问题,有空再完善下。