统一接口:为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 相关文章推荐
JQuery slideshow的一个小问题(如何发现及解决过程)
Feb 06 Javascript
使用CSS3的scale实现网页整体缩放
Mar 18 Javascript
javascript字符串与数组转换汇总
May 26 Javascript
jQuery实现延迟跳转的方法
Jun 05 Javascript
JavaScript实现强制重定向至HTTPS页面
Jun 10 Javascript
javascript运动详解
Jul 06 Javascript
jQuery实现微信长按识别二维码功能
Aug 26 Javascript
vue2组件实现懒加载浅析
Mar 29 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
May 20 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
Sep 11 Javascript
Node.js net模块功能及事件监听用法分析
Jan 05 Javascript
webpack打包html里面img后src为“[object Module]”问题
Dec 22 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数据类型的总结分析
2013/06/13 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
Javascript JSQL,SQL无处不在,
2010/05/05 Javascript
基于jquery的滚动新闻列表
2010/06/19 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
JS+JSP checkBox 全选具体实现
2014/01/02 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
基于jquery实现下拉框美化特效
2016/02/02 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
vue实现行列转换的一种方法
2019/08/06 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
python批量修改图片大小的方法
2018/07/24 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
智能钱包:Ekster
2019/11/21 全球购物
社会学专业求职信
2014/02/24 职场文书
婚前协议书怎么写
2014/04/15 职场文书
2015年教研员工作总结
2015/05/26 职场文书
python基础入门之字典和集合
2021/06/13 Python
简单总结SpringMVC拦截器的使用方法
2021/06/28 Java/Android
Mybatis是这样防止sql注入的
2021/12/06 Java/Android