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

如何在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); 
    } 
  } 

时间: 2024-11-30 11:12:37

统一接口:为FireFox添加IE的方法和属性的js代码_javascript技巧的相关文章

为FireFox添加IE的方法和属性

Ieemu.js代码   var ie = document.all != null;   var moz = !ie && document.getElementById != null && document.layers == null;      /*    * Extends the event object with srcElement, cancelBubble, returnValue,    * fromElement and toElement    

兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码_javascript技巧

在编写处理xml的网页时,经常为浏览器兼容性头疼.于是我将常用的xml操作封装为函数.经过一段时间的改进,现在已经很稳定了,用起来很舒服. 函数有-- xml_loadFile:xml同步/异步加载. xml_transformNode:xsl转换. xml_text:节点的文本. selectSingleNode:根据XPath选择单个节点. selectNodes:根据XPath选择多个节点. 全部代码(zyllibjs_xml.js)-- 复制代码 代码如下: /* zyllibjs_xm

判定是否原生方法的JS代码_javascript技巧

浏览器的趋势是加入越来越多对象,像Worker,同时也为旧有的对象添加新方法.如何兼容它的第一步就是检测它们是否存在,没有则补上自己的兼容代码.这时问题就来了,有的类库是给你做了这一步,但有时没有,有时是做了,但并不符合标准.因此单纯是typeof Array.prototype.map === "function"可能不够用.这时isNative方法就要登场了. 我一直用的版本,自己写的: 复制代码 代码如下: var isNative = function(method){//判定

window.event.keyCode兼容IE和Firefox实现js代码_javascript技巧

HTML代码 复制代码 代码如下: <input type="text" onkeydown="keyNumAll(event);" > Javascript 代码 复制代码 代码如下: function keyNumAll(evt){ //兼容IE和Firefox获得keyBoardEvent对象 evt = (evt) ? evt : ((window.event) ? window.event : ""); var key =

常用限制input的方法的js代码_javascript技巧

1.取消按钮按下时的虚线框,在input里添加属性值 hideFocus 或者 HideFocus=true 2.只读文本框内容,在input里添加属性值 readonly 3.防止退后清空的TEXT文档(可把style内容做做为类引用) 4.ENTER键可以让光标移到下一个输入框 5.只能为中文(有闪动) 6.只能为数字(有闪动) 7.只能为数字(无闪动) 8.只能输入英文和数字(有闪动) 9.屏蔽输入法 10. 只能输入 数字,小数点,减号(-) 字符(无闪动) 11. 只能输入两位小数,三

页面加载完后自动执行一个方法的js代码_javascript技巧

1.在body中用onload: <body onload="myfunction()"> 2.在脚本中用window.onload: <script type="text/javascript"> function myfun() { alert("this window.onload"); } /*用window.onload调用myfun()*/ window.onload=myfun;//不要括号 </scr

关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦_javascript技巧

1.document.formName.item("itemName") 问题 说明:IE下,可以使用document.formName.item("itemName")或document.formName.elements ["elementName"];Firefox下,只能使用document.formName.elements["elementName"]. 解决方法:统一使用document.formName.ele

动态添加js事件实现代码_javascript技巧

//表单对象 function GetObject(Name) { var inputlist=document.all.tags('input'); var i=0; for(i=0;i<inputlist.length;i++) { var input=inputlist[i]; if(input.id.indexOf(Name) !=-1) { return input; } } return null; } //设置对象事件 function setEvent(Object,EventN

JS动态添加option和删除option(附实例代码)_javascript技巧

1.动态创建select 复制代码 代码如下: function createSelect(){ var mySelect = document.createElement("select"); mySelect.id = "mySelect"; document.body.appendChild(mySelect); } 2.添加选项option 复制代码 代码如下: function addOption(){ //根据id查找对象, var obj=docume