统一接口:为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 相关文章推荐
Javascript调用XML制作连动下拉列表框
Jun 25 Javascript
关于B/S判断浏览器断开的问题讨论
Oct 29 Javascript
javascript Event对象详解及使用示例
Nov 22 Javascript
node.js中的url.format方法使用说明
Dec 10 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
Mar 03 Javascript
ANGULARJS中使用JQUERY分页控件
Sep 16 Javascript
jQuery中绑定事件bind() on() live() one()的异同
Feb 23 Javascript
vue实现tab切换外加样式切换方法
Mar 16 Javascript
layui 表格的属性的显示转换方法
Aug 14 Javascript
详解vue中使用protobuf踩坑记
May 07 Javascript
node.js使用http模块创建服务器和客户端完整示例
Feb 10 Javascript
JS this关键字在ajax中使用出现问题解决方案
Jul 17 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
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
Js获取事件对象代码
2010/08/05 Javascript
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
Angular 常用指令实例总结整理
2016/12/13 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
巴西女装购物网站:Eclectic
2018/04/24 全球购物
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
暑假实习求职信范文
2013/09/22 职场文书
电大自我鉴定
2013/10/27 职场文书
好的自荐信的要求
2013/10/30 职场文书
汽修专业学生自我鉴定
2013/11/16 职场文书
优秀老员工获奖感言
2014/02/15 职场文书
《我为你骄傲》教学反思
2014/02/20 职场文书
《夕阳真美》教学反思
2014/04/27 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
工作检讨书怎么写
2015/01/23 职场文书
仓管员岗位职责
2015/02/03 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书