兼容性问题总结

浏览器兼容性:指网页在各种浏览器上的显示效果不一致。或者是一些属性和方法在低版本的浏览器中不支持。
1.通过class来找对象
      document.getElementsByClassName("");
  //参数:类名  字符串
  //返回值:伪数组
  //ie678不兼容(H5新增方法)
2.在原来的类名基础上  添加/删除类名(    IE678不兼容)
   classList.add("");
   classList.remove("");
3.innerText的兼容性问题(防止xss攻击)
  //1. innerText是IE提出来的属性,因此低版本的火狐浏览器不支持这个属性。
  //2. 火狐有一个textContent属性,效果跟innerText一样,但是IE678不支持这个属性
  解决浏览器兼容性的处理方式: 
    1. 能力检测(常用)
    2. 代理检测:判断浏览器的类型与版本 使用麻烦
    3. 怪癖检测:ie678有很多独特的属性(怪癖)  attchEvent
      书写innerText的兼容性代码 
     
 //获取标签的innerText(兼容所有浏览器)
    function getInnerText(element) {
        if (typeof element.innerText === "string") {
            return element.innerText;
        } else {
            return element.textContent;
        }
    }
    //设置标签的innerText(兼容所有浏览器)
    function setInnerText(element, value) {
        //能力检测
        if (typeof element.innerText === "string") {
            element.innerText = value;
        } else {
            element.textContent = value;
        }
    }

 

4. 孩子节点,兄弟节点问题   
1. //firstChild //第一个节点
         //firstElementChild //第一个子元素(IE678不兼容)可以封装一个兼容性方法
         children[0];
  2. //lastChild //最后一个节点
         //lastElementChild //最后一个子元素(IE678不兼容) 可以封装一个兼容性方法
         children[children.length-1]
  //1. nextSibling:下一个兄弟节点
  //2. nextElementSibling:下一个兄弟元素(IE678不兼容)
  //3. previousSibling//上一个兄弟节点
  //4. previousElementSibling //上一个兄弟元素(IE678不兼容) 有兼容性问题 可以封装一个兼容性方法 

5.不透明度

      /*现代浏览器支持opacity属性*/(IE678不兼容)
      /*opacity: .5;*/
      /*IE678支持filter*/
      /*filter: alpha(opacity = 50);*/
      /*rgba(255,255,255,.3)是C3属性  IE678一样不兼容*/
      /**/
  解决方法:  两个都写上
     box.style.opacity = ".5";
     box.style.filter = "alpha(opacity=50)";
6.date.toLocalString();//本地风格的日期格式(兼容性问题)
7.现代浏览器:return window.getComputedStyle(element, null)[attr];
             IE678 :return element.currentStyle[attr];
 
  解决方案:
  
 function getStyle(element, attr) {
      if (window.getComputedStyle) {
        return window.getComputedStyle(element, null)[attr];
      } else {
        return element.currentStyle[attr];
      }
    }

 

8.scroll家族( IE678)
  对于现代浏览器:  window.pageYOffset去获取
   对于IE678  document.documentElement.scrollTop 获取
  解决方案
function getScrollTop() {
      return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
    }
 
    function getScrollLeft() {
      return window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0
    }
  或者
  function getScroll() {
      return {
        scrollTop:window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0,
        scrollLeft:window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0
     }
    }
 

 

9.client家族( IE678)
  
 function getClientWidth() {
      return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth || 0;
    }
 
    function getClientHeight() {
      window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight ||0
    }
 
10.注册事件的新方式
  注册事件的新方式的解决了事件覆盖的问题,但是存在浏览器兼容性问题,因此可以进行兼容性封装
 
 /添加事件
  function addEvent(element, type, fn){
      //能力检测
      if(element.addEventListener){
          element.addEventListener(type, fn, false);
      }else if(element.attachEvent){
          element.attachEvent("on"+type, fn);
      }else {
          //如果都不行,那就用on方式
          element["on"+type] = fn;
      }
  }
    或者 
  function addEvent(obj,type,handle){ 
    try{    // Chrome、FireFox、Opera、Safari、IE9.0及其以上版本 
      obj.addEventListener(type,handle,false); 
    }catch(e){ 
      try{   // IE8.0及其以下版本 
        obj.attachEvent('on' + type,handle); 
      }catch(e){ // 早期浏览器 
        obj['on' + type] = handle; 
      } 
    } 
  }


 
  //移除事件
  function removeEvent(element, type, fn) {
      if(element.removeEventListener){
          element.removeEventListener(type, fn, false);
      }else if(element.detachEvent){
         element.detachEvent("on"+type, fn);
      }else {
          element["on"+type] = null;
     }
  }

 

11.获取事件对象的时候,存在浏览器的兼容问题。
  兼容性封装
 
 
 btn.onclick = function(event){
        //只要用到了事件对象,就要记得处理浏览器兼容性
      event = event || window.event;
  }

 

12.pageX与pageY的兼容性
  
function getPage(event) {
      return {
            //在IE678中使用document.documentElement.scrollLeft就可以获取到scrollTop的值
          x:event.pageX || event.clientX + document.documentElement.scrollLeft,
          y:event.pageY || event.clientY + document.documentElement.scrollTop
      }
  }

 

13.阻止事件冒泡有浏览器兼容性问题
  兼容性处理
 
 
 link.onclick = function (event) {
      event = event || window.event;
      if(event.stopPropagation){
            event.stopPropagation();
      }else {
            event.cancelBubble = true;
      }
  }
1.HTML5语义化标签
  兼容性处理
  IE678不识别这个标签 
  document.createElement("header");//创建这个一个标签即可
  //创建的标签默认是行内样式。
  //还需给标签加一个display:block的属性。
  条件注释是IE独有的注释 css骇客。  IE678  中有很多东西,只有ie678自己能识别
    *zoom:1 
  条件注释    使用html5shiv.js
  我们每次都要去创建标签,并且还需要设置display:block属性,非常麻烦,因此我们可以引入一个第三方js文件,这个js文件的功能就是创建元素和设          置display属性。
  <!--[if lte IE 8]>
      <script src="js/html5shiv.min.js"></script>
  <![endif]-->
  //当ie浏览器的版本小于等于8的时候,才会引入html5shiv.js
  //css骇客:
  //命令:cc:ie6
  //如何获取:github.com
  <!--[if lt IE 9]>
    如果ie版本小于等于9,这段代码可以识别,如果大于9,就就是一段注释
    l:less
    t:than
    e:equal
    呵呵呵呵
  <![endif]-->
 
 
2. HTML多媒体 audio   video
<!--浏览器兼容性写法-->
  <audio autoplay loop id="music">
    <source src="music/music.mp3">
    <source src="music/music.ogg">
    <source src="music/music.wav">
    亲,你的浏览器版本太低,请升级
  </audio>

 

posted @ 2017-12-28 11:53  停停停停停停停  阅读(131)  评论(0编辑  收藏  举报