统一接口:为FireFox添加IE的方法和属性的js代码
2018-09-22 01:04
如何在Z-Blog中运行代码(纯JS版)一文中由于FF不支持insertAdjacentElement,造成无法显示“运行代码”链接。今天Google了一下,发现一篇好文,将下面的脚本存成iedom4moz.js文件,每页调用——OK,一切搞定!独乐乐,不如众乐乐,分享给诸位了^_^
复制代码 代码如下:
//JavaScriptDocument
//统一接口:为FireFox添加IE的方法和属性
if(window.Event){//修正Event的DOM
/*
IE5MacIE5MozillaKonqueror2.2Opera5
eventyesyesyesyesyes
event.returnValueyesyesnonono
event.cancelBubbleyesyesnonono
event.srcElementyesyesnonono
event.fromElementyesyesnonono
*/
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(){
});
Event.prototype.__defineGetter__(offsetY,function(){
returnthis.layerY;
});
}
if(window.Document){//修正Document的DOM
/*
IE5MacIE5MozillaKonqueror2.2Opera5
document.documentElementyesyesyesyesno
document.activeElementyesnullnonono
*/
}
if(window.Node){//修正Node的DOM
/*
IE5MacIE5MozillaKonqueror2.2Opera5
Node.replaceNodeyesnononono
Node.removeNodeyesnononono
Node.childrenyesyesnonono
Node.hasChildNodesyesyesyesyesno
Node.childNodesyesyesyesyesno
Node.swapNodeyesnononono
Node.currentStyleyesyesnonono
*/
Node.prototype.replaceNode=function(Node){//替换指定节点
this.parentNode.replaceChild(Node,this);
}
Node.prototype.removeNode=function(removeChildren){//删除指定节点
if(removeChildren)
returnthis.parentNode.removeChild(this);
else{
varrange=document.createRange();
range.selectNodeContents(this);
returnthis.parentNode.replaceChild(range.extractContents(),this);
}
}
Node.prototype.swapNode=function(Node){//交换节点
varnextSibling=this.nextSibling;
varparentNode=this.parentNode;
node.parentNode.replaceChild(this,Node);
}
}
if(window.HTMLElement){
HTMLElement.prototype.__defineGetter__(all,function(){
vara=this.getElementsByTagName(*);
varnode=this;
a.tags=function(sTagName){
returnnode.getElementsByTagName(sTagName);
}
returna;
});
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(!tmp[n.name])
tmp[n.name]=[];
tmp[n.name][tmp[n.name].length]=n;
}
if(n.id)
tmp[n.id]=n;
}
}
returntmp;
});
HTMLElement.prototype.__defineGetter__(currentStyle,function(){
returnthis.ownerDocument.defaultView.getComputedStyle(this,null);
});
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__(outerHTML,function(){
varattr;
varattrs=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.__defineGetter__(canHaveChildren,function(){
switch(this.tagName.toLowerCase()){
casearea:
casebase:
casebasefont:
casecol:
caseframe:
casehr:
caseimg:
casebr:
caseinput:
caseisindex:
caselink:
casemeta:
caseparam:
returnfalse;
}
returntrue;
});
HTMLElement.prototype.__defineSetter__(innerText,function(sText){
varparsedText=document.createTextNode(sText);
this.innerHTML=parsedText;
returnparsedText;
});
HTMLElement.prototype.__defineGetter__(innerText,function(){
varr=this.ownerDocument.createRange();
r.selectNodeContents(this);
returnr.toString();
});
HTMLElement.prototype.__defineSetter__(outerText,function(sText){
varparsedText=document.createTextNode(sText);
this.outerHTML=parsedText;
returnparsedText;
});
HTMLElement.prototype.__defineGetter__(outerText,function(){
varr=this.ownerDocument.createRange();
r.selectNodeContents(this);
returnr.toString();
});
HTMLElement.prototype.attachEvent=function(sType,fHandler){
varshortTypeName=sType.replace(/on/,);
fHandler._ieEmuEventHandler=function(e){
window.event=e;
returnfHandler();
}
this.addEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
}
HTMLElement.prototype.detachEvent=function(sType,fHandler){
varshortTypeName=sType.replace(/on/,);
if(typeof(fHandler._ieEmuEventHandler)==function)
this.removeEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
else
this.removeEventListener(shortTypeName,fHandler,true);
}
HTMLElement.prototype.contains=function(Node){//是否包含某节点
doif(Node==this)returntrue;
while(Node=Node.parentNode);
returnfalse;
}
HTMLElement.prototype.insertAdjacentElement=function(where,parsedNode){
switch(where){
casebeforeBegin:
this.parentNode.insertBefore(parsedNode,this);
break;
caseafterBegin:
this.insertBefore(parsedNode,this.firstChild);
break;
casebeforeEnd:
this.appendChild(parsedNode);
break;
caseafterEnd:
if(this.nextSibling)
this.parentNode.insertBefore(parsedNode,this.nextSibling);
else
this.parentNode.appendChild(parsedNode);
break;
}
}
HTMLElement.prototype.insertAdjacentHTML=function(where,htmlStr){
varr=this.ownerDocument.createRange();
r.setStartBefore(this);
varparsedHTML=r.createContextualFragment(htmlStr);
this.insertAdjacentElement(where,parsedHTML);
}
HTMLElement.prototype.insertAdjacentText=function(where,txtStr){
varparsedText=document.createTextNode(txtStr);
this.insertAdjacentElement(where,parsedText);
}
HTMLElement.prototype.attachEvent=function(sType,fHandler){
varshortTypeName=sType.replace(/on/,);
fHandler._ieEmuEventHandler=function(e){
window.event=e;
returnfHandler();
}
this.addEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
}
HTMLElement.prototype.detachEvent=function(sType,fHandler){
varshortTypeName=sType.replace(/on/,);
if(typeof(fHandler._ieEmuEventHandler)==function)
this.removeEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
else
this.removeEventListener(shortTypeName,fHandler,true);
}
}
下一篇:不用MOUSEMOVE也能滑动啊
文章标题:统一接口:为FireFox添加IE的方法和属性的js代码
文章链接:http://soscw.com/essay/17071.html