JS兼容性问题(FF与IE)

摘要:
event.srcElement:事件。目标;);}Dom方法和对象引用9.框架引用描述:IE可以通过ID或名称访问与此框架对应的窗口对象,而Firefox只能通过名称访问与该框架对应的窗对象;解决方案:使用帧的名称访问帧对象。此外,IE和Firefox都可以使用window.document。getElementById以访问框架对象。Firefox只能使用parentNode。

不同浏览器中js兼容问题大全

1.document.formName.item('itemName')问题

说明:

1 //IE下(两种)
2 document.formName.item("itemName");
3 document.formName.elements ["elementName"];
4 //Firefox下
5 document.formName.elements["elementName"];
6 //解决方法:
7 document.formName.elements["elementName"]

2.集合类对象问题

说明:

  IE下,可以使用()或[]获取集合类对象;

  Firefox下,只能使用[]获取集合类对象;

解决方法:统一使用[]获取集合类对象.

3.自定义属性问题

说明:

  IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义属性;

  Firefox下,只能使用getAttribute()获取自定义属性.

解决方法:统一通过getAttribute()获取自定义属性.

4.eval("idName")问题

说明:

  IE下,可以使用eval("idName")或getElementById("idName")来取得id为idName的HTML对象;

  Firefox下只能使用getElementById("idName")来取得id为idName的HTML对象;

解决方法:统一用getElementById("idName")来取得id为idName的HTML对象.

5.window.event问题

说明:

  window.event只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用.

解决方法:

document.onmousemove=function (ev){
    var oDiv=document.getElementById('div1');
    
    var oEvent=ev||event;
    
    oDiv.style.left=oEvent.clientX+'px';
    oDiv.style.top=oEvent.clientY+'px';
}


6.event.x与event.y问题

说明:

  用IE下,even对象有x,y属性,但是没有pageX,pageY属性;

  Firefox下,even对象有pageX,pageY属性,但是没有x,y属性;

解决方法:

  使用mX(mX = event.x ? event.x : event.pageX;)来代替IE下的event.x或者Firefox下的event.pageX

复杂点要考虑绝对位置:

 function getAbsPoint(e){
    var x = e.offsetLeft, y = e.offsetTop;
    while (e = e.offsetParent) {
        x += e.offsetLeft;
        y += e.offsetTop;
    }
    alert( " x: " + x + " , " + " y: " + y);
}
    

7.事件监听

说明:

  IE提供了attachEvent和detachEvent两个接口;

  而Firefox提供 的是 addEventListener和removeEventListener两个接口;

解决方法:

if(oBtn.attachEvent){
        oBtn.attachEvent('onclick', aaa);
        oBtn.attachEvent('onclick', bbb);
    }
    else{
        oBtn.addEventListener('click', aaa, false);
        oBtn.addEventListener('click', bbb, false);
    }

例子(事件绑定的公共函数):

JS兼容性问题(FF与IE)第1张JS兼容性问题(FF与IE)第2张
 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5 <title>无标题文档</title>
 6 <script type="text/javascript">
 7 function myAddEvent(obj, sEvent, fn){  //绑定事件
 8     if(obj.attachEvent){
 9         obj.attachEvent('on'+sEvent, fn);
10     }
11     else{
12         obj.addEventListener(sEvent, fn, false);
13     }
14 }
15 
16 function aaa(){
17     alert('a');
18 }
19 
20 function bbb(){
21     alert('b');
22 }
23 
24 window.onload=function (){
25     var oBtn=document.getElementById('btn1');
26     
27     myAddEvent(oBtn, 'click', aaa);
28     myAddEvent(oBtn, 'click', bbb);
29 };
30 </script>
31 </head>
32 
33 <body>
34 <input id="btn1" type="button" value="aaa" />
35 </body>
36 </html>
View Code

8.事件源的获取

说明:

  在使用事件委托的时候,通过 事件源获取来判断事件到底来自哪个元素,但是,在IE     下,event对象有srcElement属性,但是 没有target属性;Firefox下,even对象有target  属性,但是没有srcElement属性。

解决方法:

ele = function (evt){ // 捕获当前事件作用的对象
evt = evt || window.event;
  return
    (obj=event.srcElement?event.srcElement:event.target; );
}

 

dom方法及对象引用

9.frame的引用

说明:

  IE可以通过id或者name访问这个frame对应的window对象,而Firefox只可以通过 name来访问这个frame对 应的window对象;

解决方法:

  使用frame的name来访问frame对 象,另外,在IE和Firefox中都可以使用 window.document.getElementById(”frameId”)来访问这个frame对象。

10.parentElement

说明:

  IE中支持使用parentElement和parentNode获取父节点。而 Firefox只可以使用parentNode。

解决方法:

  因为firefox支持DOM,因此统一使用 parentNode来访问父节点。

11.table操作

说明:

  IE下 table中无论是用innerHTML还是appendChild插入<tr>都没有效果,而其他浏览器却显示正常。

解决方法:

  解决的方法是,将<tr>加到table的<tbody>元素中。

例子:

1 var row = document.createElement( "tr" );
2 var cell = document.createElement( "td" );
3 var cell_text = document.createTextNode( "插入的内容" );
4 cell.appendChild(cell_text);
5 row.appendChild(cell);
6 document.getElementsByTagName( "tbody" )[0].appendChild(row);

12.移除节点removeNode()和removeChild()

说明:

  appendNode在IE和Firefox下都能正常使用,但是removeNode只能在IE下用。

  removeNode方法的功能是删除一个节点,语法为node.removeNode(false)或者   node.removeNode(true),返回值是被删除的节点。

  removeNode(false)表示仅仅删除指定节点,然 后这个节点的原孩子节点提升为原双亲节点的孩子节点。

  removeNode(true)表示删除指定节点及其所有下属节点。被删除的节点成为了孤立节点,不再具有有孩子节点和双亲节点。

解决方法:

  Firefox中节点没有removeNode方法,只能用 removeChild方法代替,先回到父节点,在从父节点上移除要移除的 节点。

node.parentNode.removeChild(node); 
 // 为了在ie和firefox下都能正常使用,取上一层的父结点,然后remove。
 
13.innerText与textContent
说明:
  Firefox不支持innerText,它支持textContent来实现innerText,不过textContent没有  像 innerText一样考虑元素的display方式,所以不完全与IE兼容。如果不用textContent,  字符串里面不包含HTML代码也可以用 innerHTML代替。也可以用js写个方法实现。
解决方法:
1 //通过判断浏览器类型来兼容:
2 if(document.all)
3 document.getElementById('element').innerText = "mytext" ;
4 }else{
5 document.getElementById('element').textContent = "mytext" ;
6 }

14.document.getElementsByClassName

说明:

  getElementsByClassName不能兼容IE9之前的浏览器

解决办法:自己封装个函数。用getElementsByTagName

例子(以简易选项卡为例子):

 1 <html>
 2 <head>
 3     <title></title>
 4     <script type="text/javascript">
 5        window.onload=function(){
 6             var oTab = document.getElementById('tab');
 7             var aLi = getByClass(oTab, 'nav')[0].getElementsByTagName('li'); //使用getByClass方法
 8             var aA = oTab.getElementsByTagName('ul')[0].getElementsByTagName('a');
 9             var aDiv = getByClass(oTab, 'box'); //使用getByClass方法
10             var i = 0;
11             
12             aDiv[0].style.display = 'block';
13             
14             for(i=0; i<aLi.length; i++){
15                 aLi[i].index = i;
16                 aLi[i].onclick = function(){
17                     for(i=0; i<aLi.length; i++){
18                         aLi[i].className = '';
19                         aDiv[i].style.display = 'none';
20                     }
21                     this.className = 'active';
22                     aDiv[this.index].style.display = 'block';
23                 };
24                 aA[i].onfocus=function(){
25                     this.blur();
26                 };
27             }
28         };
29         function getByClass(oParent, sClassName){
30             var aElm=oParent.getElementsByTagName('*');
31             var aArr = [];
32             for(var i=0; i<aElm.length; i++){
33                 if(aElm[i].className == sClassName){
34                     aArr.push(aElm[i]);
35                 }
36             }
37             return aArr;
38         }
39     </script>
40     <style type="text/css">
41         div,li,ul{padding:0; margin:0;}
42         .box{display:none; height:200px; width:300px; background:#739582; border:1px solid green;}
43         li{list-style:none; float:left; padding:5px 0; text-align:center; background:green; width:100px;}
44     </style>
45 </head>
46 <body>
47     <div id="tab">
48         <div class="nav">
49             <ul>
50                 <li class="active"><a>111</a></li>
51                 <li><a>222</a></li>
52                 <li><a>333</a></li>
53             </ul>
54         </div>
55         <div class="contentbox">
56             <div class="box" style="display:block">111</div>
57             <div class="box">222</div>
58             <div class="box">333</div>
59             <div class="box">444</div>
60         </div>
61     </div>
62 </body>
63 </html>

但是呢,使用jquery就简单的多啦,$('.box')就搞定啦,所以个人建议使用jquery。

浏览器不兼容真的很麻烦,但是呢,总会找到解决的方法的。

免责声明:文章转载自《JS兼容性问题(FF与IE)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇telnet批量测试端口脚本Adobe Dreamweaver 添加库、标签和属性下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

libevent源码学习(8):event_signal_map解析

目录event_signal_map结构体向event_signal_map中添加event激活event_signal_map中的event删除event_signal_map中的event以下源码均基于libevent-2.0.21-stable。       在前文中分析了event_io_map,在windows环境下event_io_map定义为...

一文梳理JS事件

JavaScript与HTML的交互是通过事件进行的。事件,就是文档或浏览器窗口发生的一些特定的交互瞬间。 事件流 事件捕获 事件冒泡 事件处理程序 事件委托 1. 事件流 如果单机页面上的某个按钮,认为单击事件不仅仅发生在按钮上。火炬话说,在单击按钮的同时,你也单击的按钮的容器元素,甚至也单击了整个页面。 事件流描述的是从页面中接收事件的顺序。...

前后端项目对接流程梳理

  课程目标 掌握一个电商网站从设计到上线的整个过程所涉及的流程 具备独立开发一个前端项目的能力 架构设计 前后端完全分离 分层架构 模块化 技术选型 HTMl CSS JS jQery 辅助工具 Webpack NodeJs NPM Shell 效率工具 Sublime Chrome Charles Git 课程安排 //基础框架的搭建 双平台的...

通过Url Protocol实现web调用本地exe,兼容谷歌IE,并实现本地验证

1.随便在网上找个注册码写入,web调用方法为<a href="openLayerManager:">调用</a> 一定要注意后面的冒号 2.这样调用的话你会发现,如果本地没有该程序,那么你怎么点击都不会有反应,这样就需要本地exe程序有无验证 3.验证,首先需要下载两个大神写的js文件example.js和protocolchec...

js实现四舍五入Math.round与toFixed的比较

1 1、toFixed2 var total = 12.345; 3 //四舍五入,保留两位小数 4 var twoPoint = total.toFixed(2); //括号中的num即为保留的位数 5 console.log(twopoint); //12.35 6 7 但是...

JavaScript之屏幕上下左右滑动监听

前言 存在这么一个需求,根据用户在屏幕不同的滑动方向(上、下、左、右),使用js脚本判断出不同的滑动行为,更新网页为不同的界面。 源码 参考了博文[1]的源码,但由于存在一些漏洞,比如:上下滑动事件监听失效等bug,变更了判断滑动必须大于30像素的长距离为大于0像素的短距离。 使用了JS的几项底层事件API: event的事件类型 touchstart...