﻿// JavaScript Document
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){};
}

