统一接口:为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 相关文章推荐
firebug的一个有趣现象介绍
Nov 30 Javascript
javascript模拟地球旋转效果代码实例
Dec 02 Javascript
jquery 为a标签绑定click事件示例代码
Jun 23 Javascript
jQuery类选择器用法实例
Dec 23 Javascript
日常收集整理的JavaScript常用函数方法
Dec 10 Javascript
Angular.JS通过指令操作DOM的方法
May 10 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
May 12 Javascript
element实现合并单元格通用方法
Nov 13 Javascript
构建大型 Vue.js 项目的10条建议(小结)
Nov 14 Javascript
微信小程序开发摇一摇功能
Nov 22 Javascript
Angular封装表单控件及思想总结
Dec 11 Javascript
react使用antd表单赋值,用于修改弹框的操作
Oct 29 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目录导航文件代码
2006/10/09 PHP
使用adodb lite解决问题
2006/12/31 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
php实现复制移动文件的方法
2015/07/29 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
PHP调用微博接口实现微博登录的方法示例
2018/09/22 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
JS跨域总结
2012/08/30 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
学习Bootstrap滚动监听 附调用方法
2016/07/02 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
python脚本实现统计日志文件中的ip访问次数代码分享
2014/08/06 Python
在Python中使用gRPC的方法示例
2018/08/08 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
奢华时尚的创新平台:Baltini
2020/10/03 全球购物
酒店出纳岗位职责
2013/12/29 职场文书
企业申诉管理制度
2014/01/30 职场文书
2014财务人员自我评价范文
2014/09/21 职场文书
民主生活会剖析材料
2014/09/30 职场文书
法人代表证明书范本
2015/06/18 职场文书