在HTML中动态加载Javascript文件(2)

DynamicLoad.js文件代码如下:


function DynamicLoad()
{
//属性
var Self=this;      //对象自身

//功能:加载指定的文件
//参数:src——需要被加载的文件
//返回:(无)
this.Load=function(src)
{
if(Self.IsLoaded(src))    //判断该文件是否已经加载了
{
   Self.OnLoaded(src);
   return;
}
else       //如果没有加载,动态创建
{
   var objDynamic;    //动态创建的对象
   var type=Self.GetSrcType(src); //文件类型
   if(type=="js" || type=="vbs")
   {
    objDynamic=document.createElement("script");
    objDynamic.src=src;
    if(type=="js")
    {
     objDynamic.type="text/javascript";
     objDynamic.language="javascript";
    }
    else
    {
     objDynamic.type="text/vbscript";
     objDynamic.language="vbscript";
    }
   }
   else if(type=="css")
   {
    objDynamic=document.createElement("link");
    objDynamic.rel="stylesheet";
    objDynamic.type="text/css";
    objDynamic.href=src;
   }
   else
   {
    Self.OnFailed(src);
    return;
   }
   document.getElementsByTagName("head")[0].appendChild(objDynamic); //将创建的对象插入到HEAD节中
   objDynamic.onload=objDynamic.onreadystatechange=function()   //加载过程中状态改变引发的事件
   {  
    //在此函数中this指针指的是s结点对象,而不是JsLoader实例,  
    //所以必须用self来调用onsuccess事件,下同。
    if(this.readyState && this.readyState=="loading")
     return;
    else
      Self.OnLoaded(src);
   };
   objDynamic.onerror=function()            //加载过程中发生错误引发的事件
   {
    document.getElementsByTagName("head")[0].removeChild(objDynamic);
    Self.OnFailed(src);
   };
}
};

//功能:判断是否已经加载了某文件
//参数:src——需要被检查的文件
//返回:返回是否已经加载了该文件
this.IsLoaded=function(src)
{
var isLoaded=false;   //假设没有加载
var type=Self.GetSrcType(src); //得到文件的类型
var i;      //用于循环的索引
if(type=="js" || type=="vbs")
{
   var scripts=document.getElementsByTagName("script"); //得到所有的脚本对象集合
   for(i=0;i<scripts.length;i++)       //依次判断每个script对象
   {
    if(scripts[i].src && scripts[i].src.indexOf(src)!=-1)
    {
     if(scripts[i].readyState=="loaded" || scripts[i].readyState=="complete")
     {
      isLoaded=true;
      break;
     }
    }
   }
}
else if(type=="css")
{
   var links=document.getElementsByTagName("link"); //得到所有的link对象集合
   for(i=0;i<links.length;i++)        //依次判断每个link对象
   {
    if(links[i].href && links[i].href.indexOf(src)!=-1)
    {
     if(links[i].readyState=="loaded" || links[i].readyState=="complete" || links[i].readyState=="interactive")
     {
      isLoaded=true;
      break;
     }
    }
   }
}
return isLoaded;
};

//功能:得到文件的类型(即扩展名)
//参数:src——文件名
//返回:返回文件的类型
this.GetSrcType=function(src)
{
var type="";
var lastIndex=src.lastIndexOf(".");
if(lastIndex!=-1)
{
   type=src.substr(lastIndex+1);
}
return type;
};

//功能:当文件加载完成时发生的事件
//参数:src——加载完成的文件
//返回:(无)
this.OnLoaded=function(src)
{
Self.LoadedCallback(src);
};

//功能:文件加载完成时执行的回调函数
//参数:src——加载完的文件
//返回:(无)
this.LoadedCallback=function(src){};

//功能:当文件加载过程中发生错误时发生的事件
//参数:src——正在加载的文件
//返回:(无)
this.OnFailed=function(src)
{
Self.FailedCallback(src);
};

//功能:当文件加载失败时执行的回调函数
//参数:src——加载失败的文件
//返回:(无)
this.FailedCallback=function(src){};
}

页面代码:

<html>
<body>
<script language="javascript" type="text/javascript" src="DynamicLoad.js"></script>
<script language="javascript" type="text/javascript">

var dl=new DynamicLoad();
function test1()
{
dl.Load("css.css");
}
function test2()
{
dl.Load("Admin_style.css");
}
</script>
<input type="button" class="Button" onclick="test2()" value="submit"/><br/>
<input type="button" class="Button" value="button" onclick="test1()"/><br/>
<a href="">aaa</a>
</body>
</html>

注释:

js文件方法本文件包含了一个名为DynamicLoad的类,该类可以为页面动态加载js、vbs和css文件。
属性: Self——对象自身(该属性为设计时使用,程序中请尽量避免使用该属性。)
方法: Load(src)——加载指定的文件。如果加载成功,引发OnLoaded事件;如果加载失败,引发OnFailed事件。您可以通过重载回调函数LoadedCallback和FailedCallback来执行加载对应的操作。
IsLoaded(src)——判断指定的文件是否已经加载完毕。
GetSrcType(src)——得到文件类型(即扩展名)
LoadedCallback(src)——文件加载成功后执行的回调函数。请重载该方法,以处理加载文件成功之后的操作。
FailedCallback(src)——文件加载失败后执行的回调函数。请重载该方法,以处理加载文件失败之后的操作。
事件: OnLoaded(src)——文件加载成功事件。
OnFailed(src)——文件加载失败事件。

/***************************/

var dl=new DynamicLoad();    //初始化DynamicLoad对象
alert(dl.IsLoaded("DynamicLoad.js")); //判断是否已经加载了文件DynamicLoad.js
dl.Load("HttpCookie.js");    //加载HttpCookie.js
alert(dl.IsLoaded("HttpCookie.js")); //判断是否已经加载了文件HttpCookie.js。加载需要时间,一般情况下这里返回false;如果过一小段时间再判断,很可能返回true。

posted @ 2011-02-23 10:20  流失的痕迹  阅读(1542)  评论(0编辑  收藏  举报