• Javascript 不同浏览器差异和兼容方法


    浏览器兼容性是由多个不同浏览器同时存在导致的(浏览器内核、版本不同),这些浏览器在处理一个相同的页面时,表现有时会有差异,作为一个前端开发,处理兼容问题就成了我们必不可少的任务之一,下面将介绍一些处理JavaScript兼容性的方法。

     

    1. 找子标签的问题

    问题描述:

        1). childNodes, firstChild, lastChild会将两个标签之间的换行也当作文本节点

        2). firstElementChild/lastElementChild在IE中只支持IE9及以上

        3). children只包含所有的标签子节点, 在规范中没有, 但所有的浏览器都支持

     

    解决办法:

        1). 如果找子标签, 使用children

        2). 如果找标签体文本, 使用innerHTML

     

    2. 获取兄弟标签的问题

    问题描述

        1.nextElementSibling/previousElementSibling, 对IE只支持IE9及以上

        2. nextSibling/previousSibling : 返回是标签之间的换行文本节点

     

    解决:

    var preEle = ele.previousSibling;
    if(preEle.nodeType === 3) { 
        //如果是文本节点类型, 再找上一个兄弟
      preEle = preEle.previousSibling;
    }

     

    3. event

    问题描述:

        event对象创建好后, 浏览器处理的方式不相同

        1). 非标准IE只是将event对象保存为window的属性

        2). chrome除了保存, 还将event作用函数传给回调方法了

        3). firfox只是将event作用函数传给回调方法了

    解决:

    event = event || window.event;
    // 或者简写如下
    ev = ev || event;

     

    4. 滚动条坐标

    问题描述:

        在获取当前的滚动坐标时, 不同的浏览器不一样

        1). chrome: document.body.scrollTop

        2). 其它: document.documentElement.scrollTop

        3). 一种浏览器只支持一种写法, 另一种写法返回0

    解决:

    var sTop =document.body.scrollTop + document.documentElement.scrollTop
    //PS: scrollLeft值同理

    5. 添加事件监听器的函数

    问题描述:

        标准:obj.addEventListener(事件名称,事件函数,是否捕获);

           1.有捕获

           2.事件名称没有on

           3.this触发该事件的对象

        IE:obj.attachEvent(事件名称,事件函数);

           1.没有捕获

           2.事件名称有on

           3.this指向window

       

    解决:

    /*
     * 需求: 编写一个通用函数给指定UI对象设置指定的监听
     */
    function bind (obj, eventName, fun) {
      if(document.addEventListener) {
        obj.addEventListener(eventName, fun, false);
      } else {
        obj.attachEvent("on"+eventName, function() {
          fun.call(obj);
        });
      }
    }

               

    6. 取消事件的默认行为

    问题描述:

        在操作一些页面元素时会导致一些默认行为

        比如: 点击<a>转向链接, 滑动滚轮页面滚动

     

    解决:

    function stopDefault(e) {
      // 阻止默认浏览器动作(W3C)
      if ( e && e.preventDefault ) {
        e.preventDefault();
      } else {
        // IE中阻止函数器默认动作的方式
        window.event.returnValue = false;
      }
      return false;
    }

     

    7. 给元素添加滚轮滚动监听

    问题描述:  不同的浏览添加滚动监听的方式不一样

    ie/chrome : onmousewheel

      用event.wheelDelta获取

           上:120

           下:-120

    firefox :DOMMouseScroll 必须用addEventListener

       event.detail

           上:-3

           下:3

     

    解决如下:

    if(document.body.onmousewheel == undefined) {
        //firefox
      document.body.addEventListener("DOMMouseScroll", fun, false);
    } else { //IE和chrome
      document.body.onmousewheel = fun;
    }

    8. typeof 函数

    问题: 非标准IE中返回object

    解决: 函数 instanceof Function 看是否返回true

    本文为 小丁码园 作者HannaDing原创文章,如需转载请注明原文网址摘自http://www.cnblogs.com/dinghuihua/
  • 相关阅读:
    cmlink日本卡更换手机后只能打电话不能上网的解决方法
    管理后台模板
    Mysql Json、JsonArray 指定属性查询
    101ESP8266转RS485/RS232/TTL控制板安装IDE开发软件
    003STM32F407+EC200基本控制篇(阿里云物联网平台)在阿里云物联网平台上一型一密动态注册设备(STM32F407+EC200)
    805Air724UG模块(4G全网通GPRS开发)微信小程序扫码绑定Air724,并通过MQTT实现远程查看摄像头图像(自建MQTT服务器)
    4Air724UG模块(4G全网通GPRS开发)下载DTU固件和入门使用(使用的我的模块看这一节)
    3Air724UG模块(4G全网通GPRS开发)下载DTU固件和入门使用(直接从合宙购买的模组看这节)
    002STM32F407+EC200基本控制篇(阿里云物联网平台)STM32F407+EC200使用MQTT+SSL加密方式接入阿里云物联网平台(不验证服务器证书)
    202CH32V307(RISCV)学习开发以太网例程DNS域名解析
  • 原文地址:https://www.cnblogs.com/dinghuihua/p/6673883.html
Copyright © 2020-2023  润新知