打造Js库

最近开始用AJAX来进行开发,随之而来的一个问题就是,页面要引入N多个<script src="" type="text/javascript"></script>,而且有些文件又依赖于其它的js文件,所以我在想,如果能像C语言那样,把一整套js做成一个库的形式,如果某个js(如:js1)文件需要另一个js(如:js2)文件所定义的功能,那么只要在这个js1文件中加一行代码,把js2包含进去,而页面呢只需要用script标签把js1引入就OK了。

有了这个想法,就开始着手进行开发,把我写的代码发布一下,以供有兴趣的人参考,如果有更高明的方法,谢谢指导

header.js文件如下:

  1. //文件名:header.js
  2. //JsLib必须包含的头文件
  3. var Lib={
  4.     timerID:null,    //测试include的时间标志
  5.     path:null,  //库文件目录
  6.     scripts:[], //所有已包含的js
  7.     main:function(){alert("未指定Lib.main程序入口")},  //程序入口
  8.     //取文件目录
  9.     GetFilePath:function(fn)
  10.     {
  11.         var path="";
  12.         var found=false;
  13.         var scripts=document.getElementsByTagName("SCRIPT");
  14.         for(var i=0;i<scripts.length;i++)
  15.         {
  16.             var fullPath=scripts[i].src;
  17.             var index=fullPath.lastIndexOf("/");
  18.             var fileName=fullPath.substr(index+1);
  19.             if(fileName.toLowerCase()==fn.toLowerCase())
  20.             {
  21.                 if(found)
  22.                 {
  23.                     alert("警告:您在代码中多次导入["+fn+"],这有可能导致错误");
  24.                 }
  25.                 path=fullPath.substring(0,index+1);
  26.                 found=true;
  27.             }
  28.         }
  29.         if(!found)
  30.         {
  31.             alert("警告:无法找到文件["+fn+"]");
  32.         }
  33.         return path;
  34.     },
  35.     //文件包含函数,所取目录相对于header.js所在目录
  36.     include:function(path)
  37.     {
  38.         var fullPath=this.path+path
  39.         for(var i=0;i<this.scripts.length;i++)
  40.         {
  41.             var sc=this.scripts[i];
  42.             if(sc.src.toLowerCase()==fullPath.toLowerCase())
  43.             {//重复包含,跳过
  44.                 return;
  45.             }
  46.         }
  47.         var script=document.createElement("script");
  48.         script.type="text/javascript";
  49.         script.language="javascript";
  50.         script.src=fullPath;
  51.         
  52.         var head=document.getElementsByTagName("head")[0];
  53.         this.scripts.push(script);
  54.         if(!script.readyState)
  55.         {//fireFox兼容
  56.             script.οnlοad=function(evn)
  57.             {
  58.                 this.readyState="loaded";
  59.             }
  60.         }
  61.         head.appendChild(script);
  62.     },
  63.     //运行程序
  64.     Run:function()
  65.     {
  66.         //this.runningMain=fun;   //保存要运行的函数
  67.         this.timerID=window.setInterval("Lib.Trying()",1);  //开启定时器,检测include的文件,并偿试运行
  68.     },
  69.     //偿试中
  70.     Trying:function()
  71.     {
  72.         for(var i=0;i<this.scripts.length;i++)
  73.         {
  74.             var script=this.scripts[i];
  75.             if(!script.readyState)
  76.             {//fireFox下没有readyState属性,该属性会在script.onload时,被赋值
  77.                 return;
  78.             }
  79.             var state=script.readyState;
  80.             if(state!="loaded" && state!="complete")
  81.             {//尚有未加载完成的js文件
  82.                 return;
  83.             }
  84.         }
  85.         window.clearInterval(this.timerID); //清除定时器
  86.         this.main(); //运行
  87.     }
  88. }
  89. Lib.path=Lib.GetFilePath("header.js");
  90. function LibRun(evn)
  91. {
  92.     Lib.Run();
  93. }
  94. if(window.attachEvent)
  95. {
  96.     window.attachEvent("onload",LibRun)
  97. }
  98. else
  99. {
  100.     window.addEventListener("load",LibRun,false);
  101. }

path1/js2.js文件如下:

  1. /// <reference path="../header.js" />
  2. function Fun2()
  3. {
  4.     alert("fun2");
  5. }

js1.js文件如下:

  1. /// <reference path="header.js" />
  2. Lib.include("path1/js2.js");
  3. function fun1()
  4. {
  5.     alert("f1");
  6. }

 调用页面代码如下:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5.     <title>无标题页</title>
  6.     <!-- header.js是必须的,它定义了最基本的include和Run等方法 -->
  7.     <script src="JsLib/header.js" type="text/javascript"></script>
  8.     <!-- 除header.js外,我们只需一个Script标签就OK了 -->
  9.     <script language="javascript" type="text/javascript">
  10.     Lib.include("js1.js");  //包含js1.js。我们无需担心是否包含了js2.js,因为这是js1.js的事情。
  11.     Lib.main=function()
  12.     {    
  13.         fun1(); //在js1中定义
  14.         Fun2(); //在js2中定义,但js1中包含了js2
  15.     }
  16.     </script>
  17. </head>
  18. <body>
  19. </body>
  20. </html>

在IE和FIREFOX下测试通过

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值