• JS兼容性问题(FF与IE)


    不同浏览器中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);
        }

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

     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。

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

  • 相关阅读:
    6.3 The Memory Hierarchy
    去掉正在打印对话框
    SQL SERVER格式化字符串位数,不足补零
    WCF学习系列二_使用IIS发布WCF服务
    WCF学习系列一_创建第一个WCF服务
    IrisSkin4控件使用方法
    窗体加载后的设置焦点事件
    SQL 分组后取最小行号记录
    二维数组、齿形数组和游长变元表
    C#数组按值和按引用传递数组区别
  • 原文地址:https://www.cnblogs.com/wxydigua/p/3285466.html
Copyright © 2020-2023  润新知