Mozilla中独有的读写器(defineGetter、defineSetter)以及可以给Element,Event等加上prototype原型,使得在IE里用的方法同样在Mozilla中可以适用,下面贴出常用的一些代码
例如
obj.insertAdjacentHTML,currentStyle,obj.attachEvent,obj.detachEvent等等。
版权属于ErikArvidsson,webfx
复制代码 代码如下:if(Browser.isMozilla){//setupieenvironmentforMoz
extendEventObject();
emulateAttachEvent();
emulateEventHandlers(["click","dblclick","mouseover","mouseout",
"mousedown","mouseup","mousemove",
"keydown","keypress","keyup"]);
emulateCurrentStyle();
/*emulateDocumentAll();
emulateElement()
*/
//Itisbettertouseaconstantforevent.button
Event.LEFT=0;
Event.MIDDLE=1;
Event.RIGHT=2;
}
else{
Event={};
//IEisreturningwrongbuttonnumber
Event.LEFT=1;
Event.MIDDLE=4;
Event.RIGHT=2;
}
/*
*ExtendstheeventobjectwithsrcElement,cancelBubble,returnValue,
*fromElementandtoElement
*/
functionextendEventObject(){
Event.prototype.__defineSetter__("returnValue",function(b){
if(!b)this.preventDefault();
returnb;
});
Event.prototype.__defineSetter__("cancelBubble",function(b){
if(b)this.stopPropagation();
returnb;
});
Event.prototype.__defineGetter__("srcElement",function(){
varnode=this.target;
while(node.nodeType!=1)node=node.parentNode;
returnnode;
});
Event.prototype.__defineGetter__("fromElement",function(){
varnode;
if(this.type=="mouseover")
node=this.relatedTarget;
elseif(this.type=="mouseout")
node=this.target;
if(!node)return;
while(node.nodeType!=1)node=node.parentNode;
returnnode;
});
Event.prototype.__defineGetter__("toElement",function(){
varnode;
if(this.type=="mouseout")
node=this.relatedTarget;
elseif(this.type=="mouseover")
node=this.target;
if(!node)return;
while(node.nodeType!=1)node=node.parentNode;
returnnode;
});
Event.prototype.__defineGetter__("offsetX",function(){
returnthis.layerX;
});
Event.prototype.__defineGetter__("offsetY",function(){
returnthis.layerY;
});
}
/*
*Emulateselement.attachEventaswellasdetachEvent
*/
functionemulateAttachEvent(){
HTMLDocument.prototype.attachEvent=
HTMLElement.prototype.attachEvent=function(sType,fHandler){
varshortTypeName=sType.replace(/on/,"");
fHandler._ieEmuEventHandler=function(e){
window.event=e;
returnfHandler();
};
this.addEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
};
HTMLDocument.prototype.detachEvent=
HTMLElement.prototype.detachEvent=function(sType,fHandler){
varshortTypeName=sType.replace(/on/,"");
if(typeoffHandler._ieEmuEventHandler=="function")
this.removeEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
else
this.removeEventListener(shortTypeName,fHandler,true);
};
}
/*
*Thisfunctionbindstheeventobjectpassedalonginan
*eventtowindow.event
*/
functionemulateEventHandlers(eventNames){
for(vari=0;i<eventNames.length;i++){
document.addEventListener(eventNames[i],function(e){
window.event=e;
},true);//usingcapture
}
}
/*
*Simpleemulationofdocument.all
*thisoneisfarfromcomplete.Becautious
*/
functionemulateAllModel(){
varallGetter=function(){
vara=this.getElementsByTagName("*");
varnode=this;
a.tags=function(sTagName){
returnnode.getElementsByTagName(sTagName);
};
returna;
};
HTMLDocument.prototype.__defineGetter__("all",allGetter);
HTMLElement.prototype.__defineGetter__("all",allGetter);
}
functionextendElementModel(){
HTMLElement.prototype.__defineGetter__("parentElement",function(){
if(this.parentNode==this.ownerDocument)returnnull;
returnthis.parentNode;
});
HTMLElement.prototype.__defineGetter__("children",function(){
vartmp=[];
varj=0;
varn;
for(vari=0;i<this.childNodes.length;i++){
n=this.childNodes[i];
if(n.nodeType==1){
tmp[j++]=n;
if(n.name){//namedchildren
if(!tmp[n.name])
tmp[n.name]=[];
tmp[n.name][tmp[n.name].length]=n;
}
if(n.id)//childwithid
tmp[n.id]=n
}
}
returntmp;
});
HTMLElement.prototype.contains=function(oEl){
if(oEl==this)returntrue;
if(oEl==null)returnfalse;
returnthis.contains(oEl.parentNode);
};
}
functionemulateCurrentStyle(){
HTMLElement.prototype.__defineGetter__("currentStyle",function(){
returnthis.ownerDocument.defaultView.getComputedStyle(this,null);
/*
varcs={};
varel=this;
for(vari=0;i<properties.length;i++){
cs.__defineGetter__(properties[i],encapsulateObjects(el,properties[i]));
}
returncs;
*/
});
}
functionemulateHTMLModel(){
//Thisfunctionisusedtogenerateahtmlstringforthetextproperties/methods
//Itreplaces'n'with"<BR">aswellasfixesconsecutivewhitespaces
//Italsorepalacessomespecialcharacters
functionconvertTextToHTML(s){
s=s.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/n/g,"<BR>");
while(/ss/.test(s))
s=s.replace(/ss/,"");
returns.replace(/s/g,"");
}
HTMLElement.prototype.insertAdjacentHTML=function(sWhere,sHTML){
vardf;//:DocumentFragment
varr=this.ownerDocument.createRange();
switch(String(sWhere).toLowerCase()){
case"beforebegin":
r.setStartBefore(this);
df=r.createContextualFragment(sHTML);
this.parentNode.insertBefore(df,this);
break;
case"afterbegin":
r.selectNodeContents(this);
r.collapse(true);
df=r.createContextualFragment(sHTML);
this.insertBefore(df,this.firstChild);
break;
case"beforeend":
r.selectNodeContents(this);
r.collapse(false);
df=r.createContextualFragment(sHTML);
this.appendChild(df);
break;
case"afterend":
r.setStartAfter(this);
df=r.createContextualFragment(sHTML);
this.parentNode.insertBefore(df,this.nextSibling);
break;
}
};
HTMLElement.prototype.__defineSetter__("outerHTML",function(sHTML){
varr=this.ownerDocument.createRange();
r.setStartBefore(this);
vardf=r.createContextualFragment(sHTML);
this.parentNode.replaceChild(df,this);
returnsHTML;
});
HTMLElement.prototype.__defineGetter__("canHaveChildren",function(){
switch(this.tagName){
case"AREA":
case"BASE":
case"BASEFONT":
case"COL":
case"FRAME":
case"HR":
case"IMG":
case"BR":
case"INPUT":
case"ISINDEX":
case"LINK":
case"META":
case"PARAM":
returnfalse;
}
returntrue;
});
HTMLElement.prototype.__defineGetter__("outerHTML",function(){
varattr,attrs=this.attributes;
varstr="<"+this.tagName;
for(vari=0;i<attrs.length;i++){
attr=attrs[i];
if(attr.specified)
str+=""+attr.name+'="'+attr.value+'"';
}
if(!this.canHaveChildren)
returnstr+">";
returnstr+">"+this.innerHTML+"</"+this.tagName+">";
});
HTMLElement.prototype.__defineSetter__("innerText",function(sText){
this.innerHTML=convertTextToHTML(sText);
returnsText;
});
vartmpGet;
HTMLElement.prototype.__defineGetter__("innerText",tmpGet=function(){
varr=this.ownerDocument.createRange();
r.selectNodeContents(this);
returnr.toString();
});
HTMLElement.prototype.__defineSetter__("outerText",function(sText){
this.outerHTML=convertTextToHTML(sText);
returnsText;
});
HTMLElement.prototype.__defineGetter__("outerText",tmpGet);
HTMLElement.prototype.insertAdjacentText=function(sWhere,sText){
this.insertAdjacentHTML(sWhere,convertTextToHTML(sText));
};
}