统一接口:为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 相关文章推荐
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
Jan 27 Javascript
JavaScript 事件对象介绍
Apr 13 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
Dec 03 Javascript
JavaScript观察者模式(经典)
Dec 09 Javascript
jquery的checkbox,radio,select等方法小结
Aug 30 Javascript
微信小程序 css使用技巧总结
Jan 09 Javascript
详解vue+css3做交互特效的方法
Nov 20 Javascript
vue实现验证码输入框组件
Dec 14 Javascript
react 实现页面代码分割、按需加载的方法
Apr 03 Javascript
webpack开发环境和生产环境的深入理解
Nov 08 Javascript
vue 路由子组件created和mounted不起作用的解决方法
Nov 05 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
Apr 01 jQuery
在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常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
use jscript with List Proxy Server Information
2007/06/11 Javascript
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
Javascript中replace()小结
2015/09/30 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
jQuery实现增删改查
2020/12/22 jQuery
python导入时小括号大作用
2017/01/10 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
Python时间序列处理之ARIMA模型的使用讲解
2019/04/02 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
Python实现代码块儿折叠
2020/04/15 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
考核工作实施方案
2014/03/30 职场文书
房产公证书范本
2014/04/10 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
会计实训报告范文
2014/11/04 职场文书
幼儿园开学通知
2015/04/24 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
党员公开承诺书2016
2016/03/24 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
详解MySQL连接挂死的原因
2021/05/18 MySQL
MYSQL 表的全面总结
2021/11/11 MySQL