呵呵, 支持....
俺也写了一个库类, 几乎可以管理所有JS代码...
让你参考参考...
/* <script> */var Im = new Importer();
 Im.Go(fInitImporter);
 
function fInitImporter(Param)
{
 Param.Path = "/SqCsJsLib/";
 Param.Ext = ".js";
 
 Param.HFolder = "Help";
 Param.HExt = ".txt";
 
 Param.HIntervalMs = 50;
}// shawl.qiu JavaScript Document
/*-----------------------------------------------------------------------------------*\
 * shawl.qiu Javascript Importer class v1.0
\*-----------------------------------------------------------------------------------*/
//---------------------------------begin class Importer()-------------------------------//
function Importer()
{// shawl.qiu code
 //------------------------------------begin private variable
 //---------------begin about
 var Au = {};
  Au.Subject = "shawl.qiu Javascript Importer class";
  Au.Version = "v1.0";
  Au.Name = "shawl.qiu";
  Au.Email = "[email protected]";
  Au.Blog = "http://blog.csdn.net/btbtd/";
  Au.CreatedDate = "2007-9-13 v1.0";
  Au.Update = {};
  Au.Update["1"] = "";
 //---------------end about
 
 var This = this;
 
 var Param = {};
 Param.Path = "/SqCsJsLib/";
 Param.Ext = ".js";
 
 Param.HFolder = "Help";
 Param.HExt = ".txt";
 
 Param.HIntervalMs = 50;
 
 var PVar = {};
 PVar.Interval = null;
 PVar.Count = 0;
 //------------------------------------end private variable
 
 //------------------------------------begin public method
 //-------------------Begin this.Get
 this.Get = {};
 this.Get.Au = fGetAu;
 //-------------------End this.Get
 
 //-------------------Begin this.Set
 this.Set = {};
 //-------------------End this.Set
 
 this.Go = fGo;
 this.Include = fInclude;
 this.IncludeDirector = fIncludeDirector;
 this.Help = fHelp;
 //------------------------------------end public method //------------------------------------begin private method
 function fGo(fIniter)
 { // shawl.qiu code, void return
  if(fIsFunc(fIniter)) fIniter(Param);
 } // end function fGo
 
 function fIncludeDirector(sCmdList, bIncludeOnce)
 { // shawl.qiu code, void return
  var CmdAr = sCmdList.split("|");
  var CmdArLen = CmdAr.length;
  var iCmdArCount = 0;
  
  while(iCmdArCount<CmdArLen)
  {
   var sFilePath = CmdAr[iCmdArCount];
   var sClass = sFilePath.replace(/^.*\//g, "").replace(/\..*$/g, "");
   
   var bIncluded = false;
   
   if(bIncludeOnce)
   {
    bIncluded = fIsFunc(window[sClass]);
    
    //document.write("bIncluded: ", bIncluded, "<br/>");
    
    if(bIncluded) 
    {
     iCmdArCount++; 
     continue;
    }
   } // end if
   
   var sInclude =  ["<script type='text/javascript' src='",sFilePath,"'><\/script>"].join('');
   document.write(sInclude);
   //defaultStatus = sFilePath;
   
   iCmdArCount++;
  } // end while
 } // end function fIncludeDirector(sCmdList, bIncludeOnce)
 
 function fInclude(sCmdList, bIncludeOnce)
 { // shawl.qiu code, return array
  var CmdAr = sCmdList.split("|");
  var CmdArLen = CmdAr.length;
  var iCmdArCount = 0;
  var PathAr = [];
  
  while(iCmdArCount<CmdArLen)
  {
   var sCmd = CmdAr[iCmdArCount];
   var sPath = sCmd.replace(/\./g, "/");
   var sClass = sCmd.replace(/^.*\./g, "").replace(/[\d\_\-]+$/, "");
   var sFilePath = [Param.Path, sPath, "/", sClass, Param.Ext].join("");
   var sFolderPath = [Param.Path, sPath, "/"].join("");
   
   PathAr.push(sFolderPath);
   
   var bIncluded = false;
   
   if(bIncludeOnce)
   {
    bIncluded = fIsFunc(window[sClass]);
    
    //document.write("bIncluded: ", bIncluded, "<br/>");
    
    if(bIncluded) 
    {
     iCmdArCount++; 
     continue;
    }
   } // end if
   
//    document.write("sCmd: ", sCmd, "<br/>");
//    document.write("sPath: ", sPath, "<br/>");
//    document.write("sClass: ", sClass, "<br/>");
//    document.write("sFilePath: ", sFilePath, "<br/>");
   
   var sInclude =  ["<script type='text/javascript' src='",sFilePath,"'><\/script>"].join('');
   document.write(sInclude);
   
   iCmdArCount++;
  } // end while
  return PathAr;
 } // end function fInclude(sCmdList, bIncludeOnce)
 
 function fHelp(sCmdList, bHighlight)
 { // shawl.qiu code, void return
  var CmdAr = sCmdList.split("|");
  var CmdArLen = CmdAr.length;
  var iCmdArCount = 0;
  
  if(bHighlight)
  {
   fInclude("String.HighlightEngine", true);
   
   PVar.Interval = 
    setInterval
    ( 
     function()
     {
      defaultStatus = "Loading..."+(PVar.Count++);
      if(window["HighlightEngine"])
      {
       while(iCmdArCount<CmdArLen)
       {
        var sFilePath = fSetHelpPath(CmdAr[iCmdArCount]).join("");
        fXhExt(sFilePath, fHelpCallback, [bHighlight]);      
        iCmdArCount++;
        
        clearInterval(PVar.Interval);
       } // end while
       
       defaultStatus = "Done.";
       PVar.Count = 0;
      }
     }
     ,
     Param.HIntervalMs
    );
  }
  else
  {
   while(iCmdArCount<CmdArLen)
   {
    var sFilePath = fSetHelpPath(CmdAr[iCmdArCount]).join("");
    fXhExt(sFilePath, fHelpCallback, [bHighlight]);
    iCmdArCount++;
   } // end while
  } // end if
 } // end function fHelp(sCmdList, bHighlight)
 
 function fSetHelpPath(sCmd)
 { // shawl.qiu code, return array
  var sPath = sCmd.replace(/\./g, "/");
  var sClass = sCmd.replace(/^.*\./g, "").replace(/[\d\_\-]+$/, "");
  if(/^Readme$/i.test(sCmd))
  {
   return [Param.Path, "Readme", Param.HExt];
  }
  else if(/^Call$/i.test(sCmd))
  {
   return [Param.Path, "Default", Param.HExt];
  }
  else if(/^Source$/i.test(sCmd))
  {
   return [Param.Path, "default", Param.Ext];
  }
  else
  {
   //alert([Param.Path, sPath, "/", Param.HFolder, "/", sClass, Param.HExt])
   return [Param.Path, sPath, "/", Param.HFolder, "/", sClass, Param.HExt];
  }
 } // end function fSetHelpPath(sCmd)
 
 function fHelpCallback(TextAr, bHighlight)
 { // shalw.qiu code, void return;
  //alert(TextAr)
  var Body = document.body;
  
  var SpanEle = $("Span");
  
  if(bHighlight)
  {
   var Hl = new HighlightEngine();
   Hl.Go(TextAr, "Tag");
   delete Hl;
   TextAr.push("<hr/>");
   SpanEle.innerHTML = TextAr.join("");
  }
  else 
  {
   SpanEle.innerHTML = ["<xmp>", TextAr, "<\/xmp><hr/>"].join("");
  }
  
  if(Body.childNodes.length===0)
  {
   alert(0)
  }
  else
  {
   Body.insertBefore(SpanEle, Body.firstChild)
  }
 } // end function fHelpCallback(TextAr)
 
 function fIsFunc(Func)
 { // shawl.qiu code, return Boolean
  if(Func) if(Func.constructor==Function) return true;
  return false;
 } // end function fIsFunc(Func)
 
 function fXhExt(sUrl, oFunc, ExtArgAr, sMethod)
 {//shawl.qiu code, void return
  if(!sMethod) sMethod = "GET";
  var xh;
  
  try{ xh = new XMLHttpRequest();} 
  catch(e)
  {
   try{ xh = new ActiveXObject('microsoft.xmlhttp');} 
   catch(e)
   {
    try{ xh = new ActiveXObject("Msxml2.XMLHTTP");} catch(e){} // end try 2
   } // end try 1
  } // end try
  xh.open(sMethod, sUrl);
  xh.onreadystatechange =
   function()
   {
    if(xh.readyState == 4 && xh.status == 200)
    {
     if(oFunc)
     {
      if(ExtArgAr)
      {
       if(ExtArgAr.constructor==Array)
       {
        ExtArgAr.unshift([xh.responseText]);
        oFunc.apply(null, ExtArgAr);
       }
       else oFunc([xh.responseText]);
      }
      else oFunc([xh.responseText]);
     } 
     else alert(xh.responseText);
    }
   };
  
  xh.send(null);
 } // end function fXhExt(sUrl, oFunc, ExtArgAr, sMethod) function $(sTag){return document.createElement(sTag);}
 function _(sText){return document.createTextNode(sText);}
 
 function fGetAu(){ return Au; }
 //------------------------------------end private method
} // shawl.qiu code
//---------------------------------end class Importer()---------------------------------//
/*</script> */

解决方案 »

  1.   

    其实应用都在www.hua2r.com我的博客上课,右键就可以看到源码!我用CDADA格式出来的O.o自己写js从不懂到懵懂到现在可以自己写某些函数了。
    觉得好像绕了一个轨道,当初看的是prototype。看了很长时间。
    后来觉得面对对象很好,学学写写很长时间。也绕弯了!
    其实js的function就是最好的这个脚本语言最好的面对对象O.o
    看了mootools写了Ajax的对像,当初觉得很了不起的感觉。
    ……
    看了Effect C++,认为程序再通用和效率的兼顾下更应该偏向效率!
    脚本语言本身应该是被注入了,程序员的精髓的。
    你的封装,可能提高效率或者应用,但毕竟是少数,应为你很难了解内部的实现。
    后来觉得写写一些简单的函数才是王道!
    国人都有人研究prototype,jquery,mootools等的。
    我觉得很好,可以借鉴思想!但是认为应用方面的话,这些js封装的太多太大。
    当然包括我自己写的这个Oo函数库。
    希望的话,你可以看懂我写的函数,然后该用到某个函数的时候复制粘贴上去就可以。
    至于这些函数,毕竟只凭个人的能力,肯定存在很多不足的地方。
    很希望大家可以提出来,共同进步!!!
    这些是我学js得到的一些心得吧O.o
    希望大家多多交流!谢谢[email protected]
    O.o
      

  2.   

    jQuery的封装算是轻量级了,如果和dojo相比的话。
      

  3.   

    恩。。 谢谢分享。。
    JF。。
    JF
      

  4.   

    /*O.o 1.0.0 by [email protected]*/
    //get方法 获取href后面的属性 参数[val:属性名];
    Function.get = function(val) {
    var uri = window.location.search;
    var re = new RegExp(val + '=([^&]*)');
    return re.test(uri) ? uri.match(re)[1] : null; 
    };
    //prototype的类扩展或重写 有时的确觉得满好用 参数[O:源对象|o:扩展对象]
    Function.extend = function(O, o) {
    for(var p in o) O[p] = o[p]; return O;
    };
    //绑定2个语句柄 我到没怎么用这个 参数[fn:绑定的语句柄|O:语句柄中的this对象|arg:参数]
    Function.bind = function(fn, O, args) {
    return function() {return fn.apply(O, args || arguments)};
    };
    //遍历执行... 不建议用这个IE下清除内存很麻烦 为什么直接绑定到Array对象上
    Function.forEach = function(O, fn, o, args) {
    if(O.length == undefined)
    for(var i in O) fn.apply( o||O, args || [O[i], i] );
    else
    for(var i=0; i< O.length; i++) fn.apply( o||O, args || [O[i], i] );
    return O;
    };
    //Ajax对象 参数[O:应该是一个对象,用于补充或扩展当前实例,估计是用来存放一系列事件的语句柄的]
    function Ajax(O) {
    //不说了
    this.transport = (window.ActiveXObject) ? new ActiveXObject('Microsoft.XMLHTTP') : (window.XMLHttpRequest ? new XMLHttpRequest() : false);
    //基础属性
    this.options = Function.extend({
    method: 'get',
    uri: '',
    async: true,
    postBody: null,
    onComplete: function() {},
    onStateChange: function() {},
    update: null,
    evalScripts: false
    }, O || {});
    //发送命令的方法 参数[o:和上面的O是一类东西]
    this.request = function(o) {
    Function.extend(this.options, o || {});
    //打开连接
    this.transport.open(this.options.method, this.options.uri, this.options.async);
    //绑定事件
    this.transport.onreadystatechange = Function.bind(this.onStateChange, this);
    //设定post模式的请求头
    if(this.options.method == 'post') {
    this.transport.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    if (this.transport.overrideMimeType) this.transport.setRequestHeader('Connection', 'close');
    this.options.postBody = Ajax.toQueryString(this.options.postBody);
    }
    //发送
    this.transport.send(this.options.postBody);
    };
    //异步接收事件
    this.onStateChange = function() {
    //为什么用settimeout?
    //可能是用来绑定某个语句柄
    setTimeout(Function.bind(this.options.onStateChange, this), 10);
    //检查 数据是否接收完毕并且无错 好像漏了status==0的状态
    if (this.transport.readyState == 4 && this.transport.status == 200) {
    //下面这个是直接输出反馈内容的 比如返回'更新成功!' 
    if (this.options.update) document.getElementById(this.options.update).innerHTML = this.transport.responseText;
    //好像是绑定个事件
    setTimeout(Function.bind(this.options.onComplete, this, [this.transport.responseText, this.transport.responseXML]), 20);
    if (this.options.evalScripts) 
    setTimeout(Function.bind(this.evalScripts, this), 30);
    //清空事件语句柄 为什么不直接用null 而用个new Function
    this.transport.onreadystatechange = function() {};
    }
    };
    //这个还有点用 
    this.evalScripts = function() {
    var scripts = null;
    if(scripts = this.transport.responseText.match(/<script[^>]*?>[\S\s]*?<\/script>/g)) {
    Function.forEach(scripts, function(script){
    eval(script.replace(/^<script[^>]*?>/, '').replace(/<\/script>$/, ''));
    }); 
    }
    };
    };
    //将Object 转换为 search字符串链 参数[o:输入的Object]
    Ajax.toQueryString = function(o) {
    if(typeof o == 'string') return o;
    else if(typeof o == 'object') {
    var queryString = [];
    for(var p in o) queryString.push(encodeURIComponent(p)+'='+encodeURIComponent(o[p]));
    return queryString.join('&');
    }
    else return false;
    };
    //获取表单元素值 参数[el:HTML的表单元素]
    Ajax.getElementValue = function(el) {
    var value = false;
    switch(el.tagName.toLowerCase()) {
    //奇怪 为什么不用select.value 或者select.options[index].value 可能是非IE FF的浏览器兼容吧
    case 'select': value = el.getElementsByTagName('option')[el.selectedIndex].value; break;
    //checked的(多选checkbox|单选radio) 和 (按钮button|隐藏框hidden|文本框text|密码框password) 还应该有image file reset submit
    case 'input': if ( (el.checked && /checkbox|radio/.test(el.type)) || (/button|hidden|text|password/.test(el.type)) )
    value = el.value; break;
    //textarea
    case 'textarea': value = el.value;
    }
    return value;
    };
    //获取表单内的全部表单元素 参数[fm:HTML的表单]
    Ajax.getFormObject = function(fm) {
    var o = {};
    //为什么 用 * 而不分开用 select textarea input 难道顺序不能乱? 用*很浪费
    Function.forEach(fm.getElementsByTagName('*'), function(el) {
    var name = el.name;
    var value = Ajax.getElementValue(el);
    if(value && name) o[name] = value;
    });
    return o;
    };
    //以上3个方法放到一起就是将指定的表单内的所有表单元素 转换成 search字符串的形式 还是满有用的//XMLDOM对象类
    function DOMDocument() {
    //初始化
    this.hasXml = false;
    this.xmlDoc = DOMDocument.createXMLDocument();
    this.xmlDoc.async = false;
    this.xslDoc = DOMDocument.createXSLDocument();
    this.xslDoc.async = false; //加载一个xml文件 参数[aXml:路径]
    this.load = function(aXml) {
    this.xmlDoc.load(aXml);
    this.hasXml = true;
    };
    //.....这个不说了 我也很少用
    this.loadXSL = function(aXsl) {
    this.xslDoc.load(aXsl);
    if(window.ActiveXObject) {
    var oTemplate = new ActiveXObject('MSXML2.XSLTemplate');
    oTemplate.stylesheet = this.xslDoc;
    this.xsltProcessor = oTemplate.createProcessor();
    } else {
    this.xsltProcessor = new XSLTProcessor();
        this.xsltProcessor.importStylesheet(this.xslDoc);
    }
    };
    //直接加载XML文档
    this.loadXML = function(aStr) {
    if(window.ActiveXObject) this.xmlDoc.loadXML(aStr);
    else {
    var parser = new DOMParser();
    this.xmlDoc = parser.parseFromString(aStr, 'text/xml');
    }
    this.hasXml = true;
    };
    //Xpath分析器 ....这个有点兼容性问题
    this.evaluateXPath = function(aExpr, aNode) {
    aNode = aNode||this.xmlDoc;
    if(window.ActiveXObject)
    return aNode.selectNodes(aExpr);
    else {
    var xpe = new XPathEvaluator();
    var nsResolver = xpe.createNSResolver(aNode.ownerDocument == null ?
    aNode.documentElement : aNode.ownerDocument.documentElement);
    var result = xpe.evaluate(aExpr, aNode, nsResolver, 0, null);
    var found = [];
    var res;
    while (res = result.iterateNext())
    found.push(res);//push效率没有arr[arr.length]=xxx的效率高
    return found;
    }
    };
    //pass
    this.transform = function(aParams) {
    if(window.ActiveXObject) {
    for(var p in aParams) this.xsltProcessor.addParameter(p, aParams[p]);
    this.xsltProcessor.input = this.xmlDoc;
    this.xsltProcessor.transform();
    return this.xsltProcessor.output;
    } else {
    for(var p in aParams) this.xsltProcessor.setParameter(null, p, aParams[p]);     
        var oResultDom = this.xsltProcessor.transformToDocument(this.xmlDoc);
    return new XMLSerializer().serializeToString(oResultDom);
    }
    };
    };
    //创建xmldoc对象
    DOMDocument.createXMLDocument = function() {
    if (window.ActiveXObject) return new ActiveXObject('MSXML2.DOMDocument');
    else return document.implementation.createDocument('','',null);
    };
    //创建xsl对象
    DOMDocument.createXSLDocument = function() {
    if (window.ActiveXObject) return new ActiveXObject('Microsoft.FreeThreadedXMLDOM');
    else return document.implementation.createDocument('','',null);
    };
      

  5.   

    哈哈 很高兴gzdiablo()的注释 另外加的一些疑问,我晚上写个出来回答吧!
    原来,还有好多问题我没有发现的O.o
    真的很是感谢!!!另外 加注释的事情 自己先写了一部分在博客上,以后慢慢添加上!
    很希望有这方面的朋友帮我写些注释
    发我邮箱上[email protected]
    如果同意我可以把它贴在博客上 供大家一起学习 可能的话 下次把注释写入js中
    谢谢写的一些小小的注释在这里!http://www.hua2r.com/blog/fd0fccd486e002fb3dfc200e0ea957a3.html
    大家提提意见吧
      

  6.   

    看过 btbtd(影子...) 的FW js的管理那块还不错但还没有Meizz老大的FW好.而且xmlHttpRequest那块有点太简单了.还没LZ的好.FW我也有写 不过满复杂的 而且有一定的规范性 就放出xmlhttprequest这块给你们参考一下吧!//----------------------------- xmlHttpRequest部分
    //xmlhttp对象
    function xmlHttp()
    {
    this.classType = "xmlHttp"; //类型 (规范) 用于指定为强制类型时使用
    this.bubbles = false;//事件冒泡 (规范)
    Class.initialize.apply(this,arguments); //初始化 (规范)
    }
    xmlHttp.prototype = {
    //初始化 (规范)
    initialize:function(){
    this.postType = "POST";
    this.url = "";
    this.async = false;
    this.responseType = 0;//反馈类型 0:xml 1:text 2:stream
    //创建xmlHttpRequest
    if(this.xhttp=this.createXHttp())
    this.initEvent();
    },
    //中断方法
    about:function(){this.xhttp.about();},
    //加载事件
    initEvent:function()
    {
    var self = this;
    //状态变更事件语句柄
    this.xhttp.onreadystatechange = function()
    {
    switch(self.xhttp.readyState)
    {
    //完成
    case 4:
    if(self.xhttp.status==200 || self.xhttp.status==0)
    self.fireEvent("onready");
    else
    self.fireEvent("onerror",self.xhttp.status);
    break;
    //打开
    case 1:self.fireEvent("onopen");break;
    //发送
    case 2:self.fireEvent("onsended");break;
    //加载中
    case 3:self.fireEvent("onloading");break;
    }
    }
    },
    //接收反馈信息 参数[type:返回类型 0:xml/1:string/2:stream(IE) ]
    response:function(type)
    {
    if(type==null)type=this.responseType;
    switch(type)
    {
    case "stream":
    case 2:
    if(Browser.IE)return this.xhttp.responseStream;
    default:
    case "xml":
    case 0:
    return this.xhttp.responseXML;
    case "text":
    case 1:
    return this.xhttp.responseText;
    }
    },
    //发送信息包 参数[command:信息包]
    sendCommand:function(command)
    {
    if(this.xhttp!=null && command!=null)
    {
    //打开xmlHttpRequest对象
    this.xhttp.open(this.postType,this.url,this.async==true);
    //创建post请求头 后者的编码要根据实际情况定
    if(this.postType.toLowerCase()=="post")
    this.xhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    else
    this.xhttp.setRequestHeader("Content-Type","text/xml; charset=utf-8");
    //发送信息包
    this.xhttp.send(command);
    //如果是非异步模式 直接返回回馈信息 不用额外添加事件语句柄
    if(this.async==false && (this.xhttp.status==200 || this.xhttp.status==0))
    return this.response();
    }
    return "";
    },
    //创建无法创建XmlHttpRequest方法
    createXHttp:function()
    {
    var o = null;
    if(Browser.IE){
    var arr = ["MSXML3.XMLHTTP","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
    for(var i=0,l=arr.length;i<l;i++)
    try{o=new ActiveXObject(arr[i]);break;}catch(e){}
    }
    else if(Browser.FF)
    try{o=new XMLHttpRequest();}catch(e){}
    if(o==null)
    alert("无法创建XmlHttpRequest");
    return o;
    }
    }//------------------------------------ 事件部分
    //类的规范方法
    var Class = {
    //规范的初始化方法
    initialize:function()
    {
    this.fireEvent = Class.fireEvent;
    this.attachEvent = this.addEventListener = Class.attachEvent;
    this.detachEvent = this.removeEventListener = Class.detachEvent;
    this.initialize.apply(this,arguments);
    },
    //触发事件的方法 参数[e:事件名;p:参数(允许向事件语句柄传递参数)]
    //为了兼容IE和FF原有的事件 这里的事件名 需要带'on'
    fireEvent:function(e,p)
    {
    if(typeof(e)=="string")
    {
    //判断对象是否存在语句柄 有则执行
    if(typeof(this[e])=="function")this[e](p);
    //判断对象是否有绑定语句柄队列 如果有 遍历执行
    if(this.Events && this.Events[e] && this.Events[e] instanceof Array)
    for(var i=0,l=this.Events[e].length;i<l;i++)
    if(typeof(this.Events[e][i])=="function")
    this.Events[e][i](p);
    //判断对象是否可以冒泡 && 判断父对象是否支持fireEvent方法 有则触发父对象事件
    if(this.bubbles!=false && this.parent && typeof(this.parent.fireEvent)=="function")
    this.parent.fireEvent(e,p);
    }
    },
    //兼容IE和FF的 向事件语句柄队列中添加一个语句柄 参数[_eventKey:事件名;_handler:语句柄]
    attachEvent:function(_eventKey,_handler)
    {
    if(typeof(_eventKey)=="string" && typeof(_handler)=="function")
    {
    if(Browser.FF)_eventKey = "on" + _eventKey;
    if(this.Events==null)this.Events={};
    if(this.Events[_eventKey]==null)this.Events[_eventKey]=[];
    this.Events[_eventKey][this.Events[_eventKey].length]=_handler;
    }
    },
    //兼容IE和FF的 移除一个事件语句柄 参数[_eventKey:事件名;_handler:语句柄]
    detachEvent:function(_eventKey,_handler)
    {
    if(typeof(_eventKey)=="string" && typeof(_handler)=="function")
    {
    if(Browser.FF)_eventKey = "on" + _eventKey;
    if(this.Events && this.Events[_eventKey])
    {
    if(this.Events[_eventKey] instanceof Array)
    {
    this.Events[_eventKey].Remove(_handler);
    if(this.Events[_eventKey].length==0)delete this.Events[_eventKey];
    }
    else
    delete this.Events[_eventKey];
    }
    }
    }
    }//----------------------------------辅助方法
    //浏览器类型
    var Browser = {
    MO:(typeof(document.implementation)!="undefined"&&typeof(document.implementation.createDocument)!="undefined"&&typeof(HTMLDocument)!="undefined")
    ,IE:window.ActiveXObject?true:false
    ,FF:(navigator.userAgent.toLowerCase().indexOf("firefox")>-1)
    ,OP:(navigator.userAgent.toLowerCase().indexOf("opera")>-1)
    }
    //添加和移除事件语句柄方法 兼容IE/FF 参数[o:事件对象;_eventKey:对象名;_handler:语句柄]
    function $AE(o,_eventKey,_handler)
    {
    if(Browser.IE)
    {o.attachEvent("on" + _eventKey,_handler);}
    else if(Browser.FF)
    {o.addEventListener(_eventKey,_handler,false);}
    }
    function $DE(o,_eventKey,_handler)
    {
    if(Browser.IE)
    o.detachEvent("on" + _eventKey,_handler);
    else if(Browser.FF)
    o.removeEventListener(_eventKey,_handler,false);
    }