如何处理兼容问题
  • 如果两个都是属性,用逻辑||做兼容
  • 如果有一个是方法,用三元做兼容
  • 如果是多个属性或方法,封装函数做兼容

两个小知识点:
1、取消拖拽的默认行为:
document.ondragstart = function(){
  return false
}
2、阻止右键菜单的默认行为:
document.oncontextmenu = function(){
  return false
}

 
兼容问题:
一、运用逻辑运算符||做的相关兼容
1、关于获取滚动高度的不兼容问题
 IE,Chrome: document.body.scrollTop
 FF: document.documentElement.scrollTop
兼容写法:
var scrollTop = document.documentElement.scrollTop||document.body.scrollTop
 
2、关于获取事件对象的兼容:
在ie中事件对象定义为window.event,
高版本浏览器必须给函数加入e作参数传递。IE忽略该参数,用window.event来读取该event。
function (e){
  var e = e || window.event
}
 
3、获取键盘编码的兼容:
IE8 及其更早版本不支持 which 属性。不支持的浏览器可使用 keyCode 属性。
但是, keyCode 属性在 Firefox 浏览器的 onkeypress 事件中是无效的。
var x = event.which || event.keyCode;
 
4、关于事件委托获取事件源的兼容问题:
IE下,event对象有srcElement属性,但是没有target属性;
在高版本浏览器下,event对象有target属性,但是没有srcElement属性
function (e){
  var e = e || window.event
  var target = e.target || e.srcElement
}
 
二、运用三元表达式做的兼容
5、阻止事件冒泡的兼容
stopPropagation()是方法,是标准的写法;
cancelBubble是属性,赋值true表示阻止,是IE的写法。
function (e){
  var e = e || window.event
  e.stopPropagation ? e.stopPropagation : e.cancleBubble = true;
}
 
6、阻止浏览器的默认行为:
preventDefault()是标准写法,
returnValue()是IE写法
oA.onclick = function (eve){
  var e = eve || window.event
  e.preventDefault ? e.preventDefault() : e.returnValue = false
}
 
三、运用方法进行兼容的问题:
7、添加事件监听:
判断addEventListener是否存在,如果存在则用否则用IE8以下的版本(含IE8)的绑定方法attachEvent,removeEventListener()和detachEvent()也是一样的用法。
function addEventListener(obj,type,callback,capture){
    if(obj.addEventListener){
              obj.addEventListener(type,callback,capture);  //标准浏览器
     }else{
    obj.attachEvent("on" + type,callback);  //IE
  }
}
参数
说明
type
事件类型
IE:事件需要添加'on'前缀,如on+事件
W3C:事件不需要添加'on'前缀,如事件
callback
事件的处理程序,通常是一个匿名函数
capture
浏览器模型,true(捕获模型),false(冒泡模型),默认IE8以下浏览器只支持冒泡模型,所以其值默认为false。
 
 

IE内核与W3C内核事件监听区别

1. 绑定语法不同
IE:attachEvent
W3C:addEventListener
2. type参数不同
IE:事件需要添加'on'前缀,如on+事件
W3C:事件不需要添加'on'前缀,如事件
3. 参数数量不同
IE:2个参数,type、callback
W3C:3个参数,type、callback、capture(浏览器模型)
4. 触发顺序不同
IE:倒序触发,先绑定后触发
W3C:正序触发,先绑定先触发
移除事件监听:
特别说明:如果一个对象向进行事件移除,那么其绑定事件监听时事件处理程序必须是有名函数,否则是无法进行移除
function removeEventListener(obj,type,callback){
   if(obj.removeEventListener){
    obj.removeEventListener(type,callback);
   }else{
    obj.detachEvent(type,callback); // IE
  }
}
 
8、获取鼠标键值的兼容:(event.button)
function getbutton(e){
  var e = e || window.event;
  if(e){     //判断是否为标准浏览器
          return e.button
        }else if(window.event){  //判断是不是IE
                switch(e.button){
                      case 1 :  return 0;
                      case 4 :  return 1;
                      case 2 :  return 2;
                }
        }
}
 
9、关于使用getAttribute获取className不兼容的问题
function fn(obj){
      if(obj.getAttribute("class"))==null{
              return obj.getAttribute("className");  //标准浏览器不支持,ie7支持
      }else{
          return obj.getAttribute("class");  //标准浏览器支持,ie7不支持
        }
}
 
10、关于getElementsByClassName("class属性名称")的不兼容问题;
function fn(obj.class属性名称){
       if(obj.getElementsByClassName){
                  return   obj.getElementsByClassName(className);  //标准浏览器支持,ie8以下不支持
      }else{
                 var list = [];
                 var arr = obj.getElementsByTagName(*)   //上一步是获取页面所有的标签元素
                 for(var i = 0;i < arr.length;i ++){   //遍历所有元素,找出class名为指定名字的元素
                              if(arr[i].className == className){
                              list.push(arr[i]);
                              }
                 }
                  return list;
        }
}
 
 11、获取非行内样式的兼容写法
function getStyle(obj,attr){
        return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj,true)[attr];
}
 
12、event.pageX和event.pageY
event.pageX和event.pageY:获取鼠标相对于整个文档的水平及垂直坐标,但IE9之前的版本不支持
event.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft);
event.clientY+(document.documentElement.scrollTop||document.body.scrollTop);
 
13、获取浏览器窗口大小的三种方法(浏览器的视口,不包括工具栏和滚动条)。
对于Internet Explorer、Chrome、Firefox、Opera 以及 Safari:
  window.innerHeight – 浏览器窗口的内部高度
  window.innerWidth – 浏览器窗口的内部宽度
对于 Internet Explorer 8、7、6、5:
     document.documentElement.clientHeight
  document.documentElement.clientWidth
  或者
  document.body.clientHeight
  document.body.clientWidth
  window.innerHeight || document.documentElement.clientHeight
  window.innerWidth || document.documentElement.clientWidth
 
 
 
 

安排~~炒鸡全的JS兼容问题,码上-----【XUEBIG】的更多相关文章

  1. 不可错过的炒鸡棒的js迷你库

    小而美被实践是最好用的,这里收藏了一些很好用的js库,他们都功能单一且非常小. COOKIE.JS  https://github.com/js-coder/cookie.js 如果你操作过cooki ...

  2. 拖放排序插件Sortable.js 兼容好及功能全个人觉得比dragula.js 好的多

    经测试,Sortable.js 兼容好和使用方便都是比较不错的,特别手机端使用很棒 介绍 Sortable.js是一款轻量级的拖放排序列表的js插件(虽然体积小,但是功能很强大)下载地址:https: ...

  3. css js 兼容问题

    js  兼容问题 1. document.form.item 问题问题:代码中存在 document.formName.item("itemName") 这样的语句,不能在FF下运 ...

  4. io.js - 兼容 NPM 平台的 Node.js 新分支

    io.js(JavaScript I/O)是兼容 NPM 平台的 Node.js 新分支,由 Node.js 的核心开发者在 Node.js 的基础上,引入更多的 ES6 特性,它的目的是提供更快的和 ...

  5. 初学canvas,遇到width和height显示问题和用excanvas.js兼容IE问题

    /*-----------------------ITEYE 祈祷幸福博客原创,转载请注明.-------------------*/ 第一次认真写技术博客文~~~若有不严谨的地方,望指正. 今天是第 ...

  6. js兼容火狐显示上传图片预览效果

    js兼容火狐显示上传图片预览效果[谷歌也适用] <!doctype html> <html> <head> <meta content="text/ ...

  7. JS兼容各个浏览器的本地图片上传即时预览效果

    JS兼容各个浏览器的本地图片上传即时预览效果 很早以前 在工作曾经碰到这么一个需求,当时也是纠结了很久,也是google了很久,没有碰到合适的demo,今天特意研究了下这方面的的问题,所以也就做了个简 ...

  8. 炒鸡简单的canvas粒子(山东数漫江湖)

    位图的canvas一直不会被svg比下去的原因了. 俗话说,须弥芥子,是大小之说,也有以小见大之说,颗颗粒子,足以构建宏大效果. 这是一篇炒鸡简单的canvas粒子教程,主要是讲如何粒子特效的原理,一 ...

  9. [转]FireFox与IE 下js兼容触发click事件的代码

    本文转自:http://www.jb51.net/article/16549.htm FireFox与IE 下js兼容触发click事件 ,对于需要兼容这两者的朋友,就需要参考下下面的代码了<a ...

随机推荐

  1. spring 容器的基础 XmlBeanFactory

    Spring容器最核心的两个类 DefaultListableBeanFactory  与 XmlBeanDefinitionReader ,XmlBeanFactory继承自DefaultLista ...

  2. cf1110E 思维

    /* Ci'=Ci+1 + Ci-1 -Ci Ci+1 - Ci' = Ci - Ci-1 Ci' - Ci-1 = Ci+1 - Ci; 即求一次Ci’等价于交换Ci和Ci-1 与 Ci+1和Ci的 ...

  3. 在组件放使用v-model和slot插槽的简单实用

    封装的组件(SelectDefault.vue文件): <template> <div class="select-default"> <label& ...

  4. ESD选型指南

    信息来自网络,可能有误,希望指正! 一.ESD工作原理 ESD静电保护元件,又称静电抑制二极管.ESD是多个TVS晶粒或二极管采用不同的布局做成具有特定功能的多路或单路ESD保护器件,主要应用于各类通 ...

  5. (转) Golang的单引号、双引号与反引号

    Go语言的字符串类型string在本质上就与其他语言的字符串类型不同: Java的String.C++的std::string以及Python3的str类型都只是定宽字符序列 Go语言的字符串是一个用 ...

  6. python字符串之split

    函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(lis ...

  7. java线程间的通信方式

    1.同步 synchronized 2.轮询 while   volatile 3.wait/notify机制 syncrhoized加锁的线程的Object类的wait()/notify()/not ...

  8. 使用JDBC连接ElasticSearch6.3(ElasticSearch SQL JDBC)

    使用JDBC连接ElasticSearch6.3(ElasticSearch SQL JDBC) https://blog.csdn.net/scgaliguodong123_/article/det ...

  9. ExceptionLess的webAPI调用

    引用 <package id="bootstrap" version="3.0.0" targetFramework="net461" ...

  10. alpha冲刺6/10

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:感恩节~ 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 设计了拍照界面和图片上传界面 沟通了前端进度 接下 ...