统一接口:为FireFox添加IE的方法和属性的js代码


Posted in Javascript onMarch 25, 2007

如何在Z-Blog中运行代码(纯JS版)一文中由于FF不支持insertAdjacentElement,造成无法显示“运行代码”链接。今天Google了一下,发现一篇好文,将下面的脚本存成iedom4moz.js文件,每页调用——OK,一切搞定!独乐乐,不如众乐乐,分享给诸位了^_^

// JavaScript Document  
// 统一接口:为FireFox添加IE的方法和属性  
if(window.Event){// 修正Event的DOM  
  /*  
                IE5    MacIE5    Mozilla    Konqueror2.2    Opera5  
  event            yes    yes      yes      yes          yes  
  event.returnValue      yes    yes      no      no          no  
  event.cancelBubble      yes    yes      no      no          no  
  event.srcElement      yes    yes      no      no          no  
  event.fromElement      yes    yes      no      no          no  
  */  
  Event.prototype.__defineSetter__("returnValue",function(b){//   
    if(!b)this.preventDefault();  
    return b;  
    });  
  Event.prototype.__defineSetter__("cancelBubble",function(b){// 设置或者检索当前事件句柄的层次冒泡  
    if(b)this.stopPropagation();  
    return b;  
    });  
  Event.prototype.__defineGetter__("srcElement",function(){  
    var node=this.target;  
    while(node.nodeType!=1)node=node.parentNode;  
    return node;  
    });  
  Event.prototype.__defineGetter__("fromElement",function(){// 返回鼠标移出的源节点  
    var node;  
    if(this.type=="mouseover")  
      node=this.relatedTarget;  
    else if(this.type=="mouseout")  
      node=this.target;  
    if(!node)return;  
    while(node.nodeType!=1)node=node.parentNode;  
    return node;  
    });  
  Event.prototype.__defineGetter__("toElement",function(){// 返回鼠标移入的源节点  
    var node;  
    if(this.type=="mouseout")  
      node=this.relatedTarget;  
    else if(this.type=="mouseover")  
      node=this.target;  
    if(!node)return;  
    while(node.nodeType!=1)node=node.parentNode;  
    return node;  
    });  
  Event.prototype.__defineGetter__("offsetX",function(){  
    return this.layerX;  
    });  
  Event.prototype.__defineGetter__("offsetY",function(){  
    return this.layerY;  
    });  
  }  
if(window.Document){// 修正Document的DOM  
  /*  
                IE5    MacIE5    Mozilla    Konqueror2.2    Opera5  
  document.documentElement  yes    yes      yes      yes          no  
  document.activeElement    yes    null    no      no          no  
  */  
  }  
if(window.Node){// 修正Node的DOM  
  /*  
                IE5    MacIE5    Mozilla    Konqueror2.2    Opera5  
  Node.contains        yes    yes      no      no          yes  
  Node.replaceNode      yes    no      no      no          no  
  Node.removeNode        yes    no      no      no          no  
  Node.children        yes    yes      no      no          no  
  Node.hasChildNodes      yes    yes      yes      yes          no  
  Node.childNodes        yes    yes      yes      yes          no  
  Node.swapNode        yes    no      no      no          no  
  Node.currentStyle      yes    yes      no      no          no  
  */  
  Node.prototype.replaceNode=function(Node){// 替换指定节点  
    this.parentNode.replaceChild(Node,this);  
    }  
  Node.prototype.removeNode=function(removeChildren){// 删除指定节点  
    if(removeChildren)  
      return this.parentNode.removeChild(this);  
    else{  
      var range=document.createRange();  
      range.selectNodeContents(this);  
      return this.parentNode.replaceChild(range.extractContents(),this);  
      }  
    }  
  Node.prototype.swapNode=function(Node){// 交换节点  
    var nextSibling=this.nextSibling;  
    var parentNode=this.parentNode;  
    node.parentNode.replaceChild(this,Node);  
    parentNode.insertBefore(node,nextSibling);  
    }  
  }  
if(window.HTMLElement){  
  HTMLElement.prototype.__defineGetter__("all",function(){  
    var a=this.getElementsByTagName("*");  
    var node=this;  
    a.tags=function(sTagName){  
      return node.getElementsByTagName(sTagName);  
      }  
    return a;  
    });  
  HTMLElement.prototype.__defineGetter__("parentElement",function(){  
    if(this.parentNode==this.ownerDocument)return null;  
    return this.parentNode;  
    });  
  HTMLElement.prototype.__defineGetter__("children",function(){  
    var tmp=[];  
    var j=0;  
    var n;  
    for(var i=0;i<this.childNodes.length;i++){  
      n=this.childNodes[i];  
      if(n.nodeType==1){  
        tmp[j++]=n;  
        if(n.name){  
          if(!tmp[n.name])  
            tmp[n.name]=[];  
          tmp[n.name][tmp[n.name].length]=n;  
          }  
        if(n.id)  
          tmp[n.id]=n;  
        }  
      }  
    return tmp;  
    });  
  HTMLElement.prototype.__defineGetter__("currentStyle", function(){  
    return this.ownerDocument.defaultView.getComputedStyle(this,null);  
    });  
  HTMLElement.prototype.__defineSetter__("outerHTML",function(sHTML){  
    var r=this.ownerDocument.createRange();  
    r.setStartBefore(this);  
    var df=r.createContextualFragment(sHTML);  
    this.parentNode.replaceChild(df,this);  
    return sHTML;  
    });  
  HTMLElement.prototype.__defineGetter__("outerHTML",function(){  
    var attr;  
    var attrs=this.attributes;  
    var str="<"+this.tagName;  
    for(var i=0;i<attrs.length;i++){  
      attr=attrs[i];  
      if(attr.specified)  
        str+=" "+attr.name+'="'+attr.value+'"';  
      }  
    if(!this.canHaveChildren)  
      return str+">";  
    return str+">"+this.innerHTML+"</"+this.tagName+">";  
    });  
  HTMLElement.prototype.__defineGetter__("canHaveChildren",function(){  
    switch(this.tagName.toLowerCase()){  
      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":  
        return false;  
      }  
    return true;  
    });  
  HTMLElement.prototype.__defineSetter__("innerText",function(sText){  
    var parsedText=document.createTextNode(sText);  
    this.innerHTML=parsedText;  
    return parsedText;  
    });  
  HTMLElement.prototype.__defineGetter__("innerText",function(){  
    var r=this.ownerDocument.createRange();  
    r.selectNodeContents(this);  
    return r.toString();  
    });  
  HTMLElement.prototype.__defineSetter__("outerText",function(sText){  
    var parsedText=document.createTextNode(sText);  
    this.outerHTML=parsedText;  
    return parsedText;  
    });  
  HTMLElement.prototype.__defineGetter__("outerText",function(){  
    var r=this.ownerDocument.createRange();  
    r.selectNodeContents(this);  
    return r.toString();  
    });  
  HTMLElement.prototype.attachEvent=function(sType,fHandler){  
    var shortTypeName=sType.replace(/on/,"");  
    fHandler._ieEmuEventHandler=function(e){  
      window.event=e;  
      return fHandler();  
      }  
    this.addEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);  
    }  
  HTMLElement.prototype.detachEvent=function(sType,fHandler){  
    var shortTypeName=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){// 是否包含某节点  
    do if(Node==this)return true;  
    while(Node=Node.parentNode);  
    return false;  
    }  
  HTMLElement.prototype.insertAdjacentElement=function(where,parsedNode){  
    switch(where){  
      case "beforeBegin":  
        this.parentNode.insertBefore(parsedNode,this);  
        break;  
      case "afterBegin":  
        this.insertBefore(parsedNode,this.firstChild);  
        break;  
      case "beforeEnd":  
        this.appendChild(parsedNode);  
        break;  
      case "afterEnd":  
        if(this.nextSibling)  
          this.parentNode.insertBefore(parsedNode,this.nextSibling);  
        else  
          this.parentNode.appendChild(parsedNode);  
        break;  
      }  
    }  
  HTMLElement.prototype.insertAdjacentHTML=function(where,htmlStr){  
    var r=this.ownerDocument.createRange();  
    r.setStartBefore(this);  
    var parsedHTML=r.createContextualFragment(htmlStr);  
    this.insertAdjacentElement(where,parsedHTML);  
    }  
  HTMLElement.prototype.insertAdjacentText=function(where,txtStr){  
    var parsedText=document.createTextNode(txtStr);  
    this.insertAdjacentElement(where,parsedText);  
    }  
  HTMLElement.prototype.attachEvent=function(sType,fHandler){  
    var shortTypeName=sType.replace(/on/,"");  
    fHandler._ieEmuEventHandler=function(e){  
      window.event=e;  
      return fHandler();  
      }  
    this.addEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);  
    }  
  HTMLElement.prototype.detachEvent=function(sType,fHandler){  
    var shortTypeName=sType.replace(/on/,"");  
    if(typeof(fHandler._ieEmuEventHandler)=="function")  
      this.removeEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);  
    else  
      this.removeEventListener(shortTypeName,fHandler,true);  
    }  
  } 
Javascript 相关文章推荐
获取HTML DOM节点元素的方法的总结
Aug 21 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
Sep 13 Javascript
判断是否安装flash player及当前版本的JS代码
Aug 08 Javascript
js的隐含参数(arguments,callee,caller)使用方法
Jan 28 Javascript
用jquery实现的一个超级简单的下拉菜单
May 18 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
Feb 24 Javascript
javascript中eval函数用法分析
Apr 25 Javascript
jQuery网页版打砖块小游戏源码分享
Aug 20 Javascript
原生JS实现图片轮播与淡入效果的简单实例
Aug 21 Javascript
vuex实现简易计数器
Oct 27 Javascript
详解vue-cli3多环境打包配置
Mar 28 Javascript
JS写滑稽笑脸运动效果
May 28 Javascript
在Z-Blog中运行代码[html][/html](纯JS版)
Mar 25 #Javascript
JavaScript判断两种格式的输入日期的正确性的代码
Mar 25 #Javascript
表单(FORM)的一些实用效果代码
Mar 25 #Javascript
推荐dojo学习笔记
Mar 24 #Javascript
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
Mar 24 #Javascript
tbody元素支持嵌套的注意方法
Mar 24 #Javascript
xml 与javascript结合的问题解决方法
Mar 24 #Javascript
You might like
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
JavaScript中“+=”的应用
2007/02/02 Javascript
jQuery 常见学习网站与参考书
2009/11/09 Javascript
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
js Event对象的5种坐标
2011/09/12 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
django进阶之cookie和session的使用示例
2018/08/17 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
HTML5+CSS3绘制锯齿状的矩形
2016/03/01 HTML / CSS
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
会计电算化专业应届大学生求职信
2013/10/22 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
打架检讨书500字
2014/01/29 职场文书
校庆活动方案
2014/03/31 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
自强自立美德少年事迹材料
2014/08/16 职场文书
写给父母的感谢信
2015/01/22 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS
nginx常用配置conf的示例代码详解
2022/03/21 Servers