我使用的方式和大家使用的方式一致,直接使用Firefox模拟IE的函数,本库模拟了window.event的取得,中间存在一些小问题,不影响最终用户使用的效果,在此将源代码贴出,和大家分享

 

   1: if(navigator.userAgent.indexOf("MSIE")<0)
   2: {
   3:     if(window.Event)
   4:     {
   5:         Event.prototype.__defineSetter__("returnValue",function(b){ 
   6:             if(!b)this.preventDefault();
   7:             return b;
   8:             });
   9:         Event.prototype.__defineSetter__("cancelBubble",function(b){
  10:             if(b)this.stopPropagation();
  11:             return b;
  12:             });
  13:         Event.prototype.__defineGetter__("srcElement",function(){
  14:             var node=this.target;
  15:             while(node.nodeType!=1)node=node.parentNode;
  16:             return node;
  17:             });
  18:         Event.prototype.__defineGetter__("fromElement",function(){
  19:             var node;
  20:             if(this.type=="mouseover")
  21:                 node=this.relatedTarget;
  22:             else if(this.type=="mouseout")
  23:                 node=this.target;
  24:             if(!node)return;
  25:             while(node.nodeType!=1)node=node.parentNode;
  26:             return node;
  27:             });
  28:         Event.prototype.__defineGetter__("toElement",function(){
  29:             var node;
  30:             if(this.type=="mouseout")
  31:                 node=this.relatedTarget;
  32:             else if(this.type=="mouseover")
  33:                 node=this.target;
  34:             if(!node)return;
  35:             while(node.nodeType!=1)node=node.parentNode;
  36:             return node;
  37:             });
  38:         Event.prototype.__defineGetter__("offsetX",function(){
  39:             return this.layerX;
  40:             });
  41:         Event.prototype.__defineGetter__("offsetY",function(){
  42:             return this.layerY;
  43:             });
  44:     }
  45:     if(window.Node){
  46:         Node.prototype.replaceNode=function(Node){// 替换指定节点
  47:             this.parentNode.replaceChild(Node,this);
  48:             }
  49:         Node.prototype.removeNode=function(removeChildren){// 删除指定节点
  50:             if(removeChildren)
  51:                 return this.parentNode.removeChild(this);
  52:             else{
  53:                 var range=document.createRange();
  54:                 range.selectNodeContents(this);
  55:                 return this.parentNode.replaceChild(range.extractContents(),this);
  56:                 }
  57:             }
  58:         Node.prototype.swapNode=function(Node){// 交换节点
  59:             var nextSibling=this.nextSibling;
  60:             var parentNode=this.parentNode;
  61:             node.parentNode.replaceChild(this,Node);
  62:             parentNode.insertBefore(node,nextSibling);
  63:             }
  64:     }
  65:     if(window.HTMLElement){
  66:         HTMLElement.prototype.__defineGetter__("all",function(){
  67:             var a=this.getElementsByTagName("*");
  68:             var node=this;
  69:             a.tags=function(sTagName){
  70:                 return node.getElementsByTagName(sTagName);
  71:                 }
  72:             return a;
  73:             });
  74:         HTMLElement.prototype.__defineGetter__("parentElement",function(){
  75:             if(this.parentNode==this.ownerDocument)return null;
  76:             return this.parentNode;
  77:             });
  78:         HTMLElement.prototype.__defineGetter__("children",function(){
  79:             var tmp=[];
  80:             var j=0;
  81:             var n;
  82:             for(var i=0;i<this.childNodes.length;i++){
  83:                 n=this.childNodes[i];
  84:                 if(n.nodeType==1){
  85:                     tmp[j++]=n;
  86:                     if(n.name){
  87:                         if(!tmp[n.name])
  88:                             tmp[n.name]=[];
  89:                         tmp[n.name][tmp[n.name].length]=n;
  90:                         }
  91:                     if(n.id)
  92:                         tmp[n.id]=n;
  93:                     }
  94:                 }
  95:             return tmp;
  96:             });
  97:         HTMLElement.prototype.__defineGetter__("currentStyle", function(){
  98:             return this.ownerDocument.defaultView.getComputedStyle(this,null);
  99:             });
 100:         HTMLElement.prototype.__defineSetter__("outerHTML",function(sHTML){
 101:             var r=this.ownerDocument.createRange();
 102:             r.setStartBefore(this);
 103:             var df=r.createContextualFragment(sHTML);
 104:             this.parentNode.replaceChild(df,this);
 105:             return sHTML;
 106:             });
 107:         HTMLElement.prototype.__defineGetter__("outerHTML",function(){
 108:             var attr;
 109:             var attrs=this.attributes;
 110:             var str="<"+this.tagName;
 111:             for(var i=0;i<attrs.length;i++){
 112:                 attr=attrs[i];
 113:                 if(attr.specified)
 114:                     str+=" "+attr.name+'="'+attr.value+'"';
 115:                 }
 116:             if(!this.canHaveChildren)
 117:                 return str+">";
 118:             return str+">"+this.innerHTML+"</"+this.tagName+">";
 119:             });
 120:         HTMLElement.prototype.__defineGetter__("canHaveChildren",function(){
 121:             switch(this.tagName.toLowerCase()){
 122:                 case "area":
 123:                 case "base":
 124:                 case "basefont":
 125:                 case "col":
 126:                 case "frame":
 127:                 case "hr":
 128:                 case "img":
 129:                 case "br":
 130:                 case "input":
 131:                 case "isindex":
 132:                 case "link":
 133:                 case "meta":
 134:                 case "param":
 135:                     return false;
 136:                 }
 137:             return true;
 138:             });
 139:     
 140:         HTMLElement.prototype.__defineSetter__("innerText",function(sText){
 141:             if(this.tagName!=null && this.tagName=="TEXTAREA")
 142:             {
 143:                 this.value=sText;
 144:             }
 145:             else
 146:             {
 147:                 var parsedText=document.createTextNode(sText);
 148:                 this.innerHTML=parsedText;
 149:                 return parsedText;
 150:             }
 151:             });
 152:         HTMLElement.prototype.__defineGetter__("innerText",function(){
 153:             var r=this.ownerDocument.createRange();
 154:             r.selectNodeContents(this);
 155:             return r.toString();
 156:             });
 157:         HTMLElement.prototype.__defineSetter__("outerText",function(sText){
 158:             var parsedText=document.createTextNode(sText);
 159:             this.outerHTML=parsedText;
 160:             return parsedText;
 161:             });
 162:         HTMLElement.prototype.__defineGetter__("outerText",function(){
 163:             var r=this.ownerDocument.createRange();
 164:             r.selectNodeContents(this);
 165:             return r.toString();
 166:             });
 167:         HTMLElement.prototype.attachEvent=function(sType,fHandler){
 168:             var shortTypeName=sType.replace(/on/,"");
 169:             this.addEventListener(shortTypeName,fHandler,false);
 170:             }
 171:         Document.prototype.attachEvent=function(sType,fHandler){
 172:                 var shortTypeName=sType.replace(/on/,"");
 173:                 this.addEventListener(shortTypeName,fHandler,false);
 174:             };
 175:         Window.prototype.attachEvent=function(sType,fHandler){
 176:                 var shortTypeName=sType.replace(/on/,"");
 177:                 this.addEventListener(shortTypeName,fHandler,false);
 178:             };
 179:         HTMLElement.prototype.detachEvent=function(sType,fHandler){
 180:             var shortTypeName=sType.replace(/on/,"");
 181:             this.removeEventListener(shortTypeName,fHandler,true);
 182:             }
 183:         HTMLElement.prototype.contains=function(node){// 是否包含某节点
 184:             if(node==null)return false;
 185:             do if(node==this)return true;
 186:             while(node=node.parentNode);
 187:             return false;
 188:             }
 189:         HTMLElement.prototype.insertAdjacentElement=function(where,parsedNode){
 190:             switch(where){
 191:                 case "beforeBegin":
 192:                     this.parentNode.insertBefore(parsedNode,this);
 193:                     break;
 194:                 case "afterBegin":
 195:                     this.insertBefore(parsedNode,this.firstChild);
 196:                     break;
 197:                 case "beforeEnd":
 198:                     this.appendChild(parsedNode);
 199:                     break;
 200:                 case "afterEnd":
 201:                     if(this.nextSibling)
 202:                         this.parentNode.insertBefore(parsedNode,this.nextSibling);
 203:                     else
 204:                         this.parentNode.appendChild(parsedNode);
 205:                     break;
 206:                 }