请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 4910|回复: 6

让FF和IE离得更近 [复制链接]

ariex 楼主

Dreamlessness

钻石会员

帖子
4960
体力
13275
威望
11
居住地
大洋洲 澳大利亚
发表于 2007-12-11 09:18:04 |显示全部楼层
找东西的时候看到的,给FF添加了IE专有的属性和方法
  1. <script language="JavaScript" type="Text/JavaScript">
  2. <!--
  3. if(window.Event){// 修正Event的DOM
  4.     /*
  5.                                 IE5        MacIE5        Mozilla        Konqueror2.2        Opera5
  6.     event                        yes        yes            yes            yes                    yes
  7.     event.returnValue            yes        yes            no            no                    no
  8.     event.cancelBubble            yes        yes            no            no                    no
  9.     event.srcElement            yes        yes            no            no                    no
  10.     event.fromElement            yes        yes            no            no                    no
  11.    
  12.     */
  13.     Event.prototype.__defineSetter__("returnValue",function(b){//
  14.         if(!b)this.preventDefault();
  15.         return b;
  16.         });
  17.     Event.prototype.__defineSetter__("cancelBubble",function(b){// 设置或者检索当前事件句柄的层次冒泡
  18.         if(b)this.stopPropagation();
  19.         return b;
  20.         });
  21.     Event.prototype.__defineGetter__("srcElement",function(){
  22.         var node=this.target;
  23.         while(node.nodeType!=1)node=node.parentNode;
  24.         return node;
  25.         });
  26.     Event.prototype.__defineGetter__("fromElement",function(){// 返回鼠标移出的源节点
  27.         var node;
  28.         if(this.type=="mouseover")
  29.             node=this.relatedTarget;
  30.         else if(this.type=="mouseout")
  31.             node=this.target;
  32.         if(!node)return;
  33.         while(node.nodeType!=1)node=node.parentNode;
  34.         return node;
  35.         });
  36.     Event.prototype.__defineGetter__("toElement",function(){// 返回鼠标移入的源节点
  37.         var node;
  38.         if(this.type=="mouseout")
  39.             node=this.relatedTarget;
  40.         else if(this.type=="mouseover")
  41.             node=this.target;
  42.         if(!node)return;
  43.         while(node.nodeType!=1)node=node.parentNode;
  44.         return node;
  45.         });
  46.     Event.prototype.__defineGetter__("offsetX",function(){
  47.         return this.layerX;
  48.         });
  49.     Event.prototype.__defineGetter__("offsetY",function(){
  50.         return this.layerY;
  51.         });
  52.     }
  53. if(window.Document){// 修正Document的DOM
  54.     /*
  55.                                 IE5        MacIE5        Mozilla        Konqueror2.2        Opera5
  56.     document.documentElement    yes        yes            yes            yes                    no
  57.     document.activeElement        yes        null        no            no                    no
  58.    
  59.     */
  60.     }
  61. if(window.Node){// 修正Node的DOM
  62.     /*
  63.                                 IE5        MacIE5        Mozilla        Konqueror2.2        Opera5
  64.     Node.contains                yes        yes            no            no                    yes
  65.     Node.replaceNode            yes        no            no            no                    no
  66.     Node.removeNode                yes        no            no            no                    no
  67.     Node.children                yes        yes            no            no                    no
  68.     Node.hasChildNodes            yes        yes            yes            yes                    no
  69.     Node.childNodes                yes        yes            yes            yes                    no
  70.     Node.swapNode                yes        no            no            no                    no
  71.     Node.currentStyle            yes        yes            no            no                    no
  72.    
  73.     */
  74.     Node.prototype.replaceNode=function(Node){// 替换指定节点
  75.         this.parentNode.replaceChild(Node,this);
  76.         }
  77.     Node.prototype.removeNode=function(removeChildren){// 删除指定节点
  78.         if(removeChildren)
  79.             return this.parentNode.removeChild(this);
  80.         else{
  81.             var range=document.createRange();
  82.             range.selectNodeContents(this);
  83.             return this.parentNode.replaceChild(range.extractContents(),this);
  84.             }
  85.         }
  86.     Node.prototype.swapNode=function(Node){// 交换节点
  87.         var nextSibling=this.nextSibling;
  88.         var parentNode=this.parentNode;
  89.         node.parentNode.replaceChild(this,Node);
  90.         parentNode.insertBefore(node,nextSibling);
  91.         }
  92.     }
  93. if(window.HTMLElement){
  94.     HTMLElement.prototype.__defineGetter__("all",function(){
  95.         var a=this.getElementsByTagName("*");
  96.         var node=this;
  97.         a.tags=function(sTagName){
  98.             return node.getElementsByTagName(sTagName);
  99.             }
  100.         return a;
  101.         });
  102.     HTMLElement.prototype.__defineGetter__("parentElement",function(){
  103.         if(this.parentNode==this.ownerDocument)return null;
  104.         return this.parentNode;
  105.         });
  106.     HTMLElement.prototype.__defineGetter__("children",function(){
  107.         var tmp=[];
  108.         var j=0;
  109.         var n;
  110.         for(var i=0;i<this.childNodes.length;i++){
  111.             n=this.childNodes[i];
  112.             if(n.nodeType==1){
  113.                 tmp[j++]=n;
  114.                 if(n.name){
  115.                     if(!tmp[n.name])
  116.                         tmp[n.name]=[];
  117.                     tmp[n.name][tmp[n.name].length]=n;
  118.                     }
  119.                 if(n.id)
  120.                     tmp[n.id]=n;
  121.                 }
  122.             }
  123.         return tmp;
  124.         });
  125.     HTMLElement.prototype.__defineGetter__("currentStyle", function(){
  126.         return this.ownerDocument.defaultView.getComputedStyle(this,null);
  127.         });
  128.     HTMLElement.prototype.__defineSetter__("outerHTML",function(sHTML){
  129.         var r=this.ownerDocument.createRange();
  130.         r.setStartBefore(this);
  131.         var df=r.createContextualFragment(sHTML);
  132.         this.parentNode.replaceChild(df,this);
  133.         return sHTML;
  134.         });
  135.     HTMLElement.prototype.__defineGetter__("outerHTML",function(){
  136.         var attr;
  137.         var attrs=this.attributes;
  138.         var str="<"+this.tagName;
  139.         for(var i=0;i<attrs.length;i++){
  140.             attr=attrs[i];
  141.             if(attr.specified)
  142.                 str+=" "+attr.name+'="'+attr.value+'"';
  143.             }
  144.         if(!this.canHaveChildren)
  145.             return str+">";
  146.         return str+">"+this.innerHTML+"</"+this.tagName+">";
  147.         });
  148.     HTMLElement.prototype.__defineGetter__("canHaveChildren",function(){
  149.         switch(this.tagName.toLowerCase()){
  150.             case "area":
  151.             case "base":
  152.             case "basefont":
  153.             case "col":
  154.             case "frame":
  155.             case "hr":
  156.             case "img":
  157.             case "br":
  158.             case "input":
  159.             case "isindex":
  160.             case "link":
  161.             case "meta":
  162.             case "param":
  163.                 return false;
  164.             }
  165.         return true;
  166.         });

  167.     HTMLElement.prototype.__defineSetter__("innerText",function(sText){
  168.         var parsedText=document.createTextNode(sText);
  169.         this.innerHTML=parsedText;
  170.         return parsedText;
  171.         });
  172.     HTMLElement.prototype.__defineGetter__("innerText",function(){
  173.         var r=this.ownerDocument.createRange();
  174.         r.selectNodeContents(this);
  175.         return r.toString();
  176.         });
  177.     HTMLElement.prototype.__defineSetter__("outerText",function(sText){
  178.         var parsedText=document.createTextNode(sText);
  179.         this.outerHTML=parsedText;
  180.         return parsedText;
  181.         });
  182.     HTMLElement.prototype.__defineGetter__("outerText",function(){
  183.         var r=this.ownerDocument.createRange();
  184.         r.selectNodeContents(this);
  185.         return r.toString();
  186.         });
  187.     HTMLElement.prototype.attachEvent=function(sType,fHandler){
  188.         var shortTypeName=sType.replace(/on/,"");
  189.         fHandler._ieEmuEventHandler=function(e){
  190.             window.event=e;
  191.             return fHandler();
  192.             }
  193.         this.addEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
  194.         }
  195.     HTMLElement.prototype.detachEvent=function(sType,fHandler){
  196.         var shortTypeName=sType.replace(/on/,"");
  197.         if(typeof(fHandler._ieEmuEventHandler)=="function")
  198.             this.removeEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
  199.         else
  200.             this.removeEventListener(shortTypeName,fHandler,true);
  201.         }
  202.     HTMLElement.prototype.contains=function(Node){// 是否包含某节点
  203.         do if(Node==this)return true;
  204.         while(Node=Node.parentNode);
  205.         return false;
  206.         }
  207.     HTMLElement.prototype.insertAdjacentElement=function(where,parsedNode){
  208.         switch(where){
  209.             case "beforeBegin":
  210.                 this.parentNode.insertBefore(parsedNode,this);
  211.                 break;
  212.             case "afterBegin":
  213.                 this.insertBefore(parsedNode,this.firstChild);
  214.                 break;
  215.             case "beforeEnd":
  216.                 this.appendChild(parsedNode);
  217.                 break;
  218.             case "afterEnd":
  219.                 if(this.nextSibling)
  220.                     this.parentNode.insertBefore(parsedNode,this.nextSibling);
  221.                 else
  222.                     this.parentNode.appendChild(parsedNode);
  223.                 break;
  224.             }
  225.         }
  226.     HTMLElement.prototype.insertAdjacentHTML=function(where,htmlStr){
  227.         var r=this.ownerDocument.createRange();
  228.         r.setStartBefore(this);
  229.         var parsedHTML=r.createContextualFragment(htmlStr);
  230.         this.insertAdjacentElement(where,parsedHTML);
  231.         }
  232.     HTMLElement.prototype.insertAdjacentText=function(where,txtStr){
  233.         var parsedText=document.createTextNode(txtStr);
  234.         this.insertAdjacentElement(where,parsedText);
  235.         }
  236.     HTMLElement.prototype.attachEvent=function(sType,fHandler){
  237.         var shortTypeName=sType.replace(/on/,"");
  238.         fHandler._ieEmuEventHandler=function(e){
  239.             window.event=e;
  240.             return fHandler();
  241.             }
  242.         this.addEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
  243.         }
  244.     HTMLElement.prototype.detachEvent=function(sType,fHandler){
  245.         var shortTypeName=sType.replace(/on/,"");
  246.         if(typeof(fHandler._ieEmuEventHandler)=="function")
  247.             this.removeEventListener(shortTypeName,fHandler._ieEmuEventHandler,false);
  248.         else
  249.             this.removeEventListener(shortTypeName,fHandler,true);
  250.         }
  251.     }
  252. //-->
  253. </script>
复制代码


举个例子,在FF中使用currentStyle:

 提示:您可以先修改部分代码再运行



搭车问个问题,IE中能不能像这样给页面元素添加自定义的属性和方法?
已有 1 人评分威望 收起 理由
Sheneyan + 1 谢谢分享

总评分: 威望 + 1   查看全部评分

西部数码顶级域名注册商39元抢注!
帖子
667
体力
2229
威望
0
居住地
山东省 烟台市
发表于 2008-3-5 20:04:09 |显示全部楼层
FF中专有的__defineGetter__和__defineSetter方法。对IE不会造成任何副作用。
__defineGetter__接受两个参数(propertyName,fn getMethod)

前一个参数:propertyName 就是制定元素的某个属性。
后一个参数:fn getMethod是一个函数,当取某个元素(对象)的上面的property name属性的时候,就调用这个函数,返回值就是上面的属性的值。

同理,__defineSetter__就是用来设置属性用的,同样也是Mozilla FireFox钟专有的方法。也接受两个参数(propertyName,fn setMethod)

通过这两个函数就可以模拟出很多IE中独有的属性,使得FF和IE对属性的使用更通用,编程时障碍更小。

楼上的例子就很实用!
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

ariex 楼主

Dreamlessness

钻石会员

帖子
4960
体力
13275
威望
11
居住地
大洋洲 澳大利亚
发表于 2008-3-5 20:35:59 |显示全部楼层
ls挖尸体的。。。


我还是很想知道,IE里有没类似FF中HTMLElement这个东西?

使用道具 举报

帖子
667
体力
2229
威望
0
居住地
山东省 烟台市
发表于 2008-3-6 20:38:58 |显示全部楼层
我是初学者,不知道MF中的HTMLElement是什么东西,但是可以通过下面的代码对比一下IE和FF的区别。

 提示:您可以先修改部分代码再运行


[ 本帖最后由 chensulong 于 2008-3-6 20:41 编辑 ]

使用道具 举报

bjaj 
帖子
10
体力
26
威望
0
居住地
广东省 东莞市
发表于 2008-3-22 13:12:48 |显示全部楼层
看完了,但还是不明白

使用道具 举报

77me 

亲亲米

中级会员

帖子
1836
体力
401
威望
2
发表于 2008-6-13 17:17:09 |显示全部楼层
看过这个 我问过IE中能不能像FF一样这么做 答案是否定的。
还有 楼主发的这些 有时候并不好用。

尽量还是自己写一些标准的吧。
我! 非新手≠高手

使用道具 举报

豪情

高级会员 手机认证 

帖子
179
体力
710
威望
0
发表于 2010-3-11 13:30:17 |显示全部楼层
看了还是不明白,但是得回一下。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 10:16 , Processed in 0.181302 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部