在使用js的过程中,往往会发现关于IE浏览器的兼容问题,当然微软现在自己也打算抛弃IE,推出了edge浏览器,对于前端来说是个好消息.

但IE的用户占比仍然不容小觑,因此这里整理下常见的几个兼容问题附上解决方案,以免不时之需.

1.非行内样式的获取

  IE浏览器:element.currentstyle+attr

  正常浏览器(chrome,FF):getComputedStyle(element,false)+attr

这两类浏览器以下都简称为IE和正常

接下来封装一个函数,方便调用(兼容所有浏览器)

function getStyle(ele,attr){
var a = "";
if(ele.currentStyle){      //IE
a = ele.currentStyle[attr];
}else{
a = getComputedStyle(ele,false)[attr]; //正常
}

2.获取事件对象

     IE  : window.event

  正常 : 给事件传参

obox.onclick=function(eve){
var e=eve||window.event;
console.log(e)
}

3.阻止事件冒泡

 事件冒泡:当触发元素的某个事件时,它会先触发自己的对应事件,然后依次向上触发所有父级的相同事件;上一父级没有相同事件,继续向上触发
需要注意的是onmouseenter和onmouseleave不支持事件冒泡
   IE    : event.cancelBubble=true
  正常 : event.stopPropagation()
function stopBubble(e){
if(e.stopPropagation){
e.stopPropagation();    //正常
}else{
e.cancelBubble = true; //IE
}
}

4.事件委托

事件委托:将多个相同元素的相同事件,添加给页面上现存的共同的父元素,利用事件冒泡,配合事件源,找到真正点击的元素

  IE     : event.srcElement
  正常 : event.target
function tar(t){
var t = e.target || e.srcElement;}

5.添加事件绑定方式

事件绑定方式有两种:赋值式和监听式

(1)赋值式: (DOM 0级事件绑定)
 它比较常用,没兼容问题
  例子:obox.onclick=function(){}
(2)监听式: (DOM 2级事件绑定) 
  IE     : element.attachEvent("on"+type,cb)
  正常 : element.addEventListener(type,cb)
function addEvent(ele,type,cb){
if(ele.addEventListener){
ele.addEventListener(type,cb)   //监听式:正常
}else if(ele.attachEvent){
ele.attachEvent("on"+type,cb) //监听式:IE
}else{
ele["on"+type] = cb;      //赋值式
}
}

6.删除事件绑定方式

同样的,事件绑定方式的删除对应

(1)删除赋值式事件绑定
  例子:obox.onclick=null
(2)删除监听式事件绑定:
  IE     : element.detachEvent("on"+type,cb)
  正常 : element.removeEventListener(type,cb)
function removeEvent(ele,type,cb){
if(ele.removeEventListener){
ele.removeEventListener(type,cb)  //监听式:正常的删除
}else if(ele.detachEvent){
ele.detachEvent("on"+type,cb)   //监听式:IE的删除
}else{
ele["on"+type] = null;       //赋值式的删除
}
}

7.键盘事件的键值获取

IE     : event.which

正常 : event.keycode

function code(eve){
var e=eve||window.event; //先获取事件
var code=e.keyCode||e.which; //再获取键值
}

8.阻止默认事件

 IE     : event.returnValue = false
 正常 : event.preventDefault()
 function stopDefault(e){
if(e.preventDefault){
e.preventDefault() //正常
}else{
e.returnValue = false; //IE
}
}

9.鼠标的页面位置pageX,pageY

 function getPage(e) {
var pageX = e.pageX || e.clientX + getScroll().scrollLeft;
var pageY = e.pageY || e.clientY + getScroll().scrollTop;
return {
pageX: pageX,
pageY: pageY
}
}

10.滚轮移动距离scrollTop

function getScroll() {
if (document.documentElement.scrollTop) {
return document.documentElement.scrollTop;
} else if (document.body.scrollTop) {
return document.body.scrollTop;
}

11.严格模式的开启

;(function(){"use strict"})();

碰到新的兼容问题会继续更新,欢迎讨论

js中的兼容问题汇总的更多相关文章

  1. js中的DOM操作汇总

    一.DOM创建 DOM节点(Node)通常对应于一个标签,一个文本,或者一个HTML属性.DOM节点有一个nodeType属性用来表示当前元素的类型,它是一个整数: Element,元素 Attrib ...

  2. JS中的兼容问题总结

    今天总结总结在JS里面遇到的兼容性问题 1.获取滚动距离的兼容性问题: document.documentElement.scrollTop  ||  document.body.scrollTop ...

  3. JS中浏览器兼容问题

    body的子节点IE 火狐 显示3个  其他显示7个 float浮动中的兼容 link 操作外联的兼容

  4. js中浏览器兼容startsWith 、endsWith 函数

    在做js开发的时候用到了startsWith函数时,发现各个浏览器不兼容问题,因为对开发来说,chrome浏览器最好用,就一直在chrome浏览器中使用这两个函数没有任何问题,但在ie浏览器访问就直接 ...

  5. js中typeof的用法汇总[转载]

    http://www.jb51.net/article/43187.htm JavaScript中的typeof其实非常复杂,它可以用来做很多事情,但同时也有很多怪异的表现.本文列举出了它的多个用法, ...

  6. 记录js中的兼容问题及解决办法

    1.获取非行内样式的兼容问题: 2.获取事件对象的兼容问题: 3.事件冒泡的兼容: 4.keyCode的兼容问题: 5.处理默认事件的兼容问题: 6.事件的绑定兼容问题:

  7. js中typeof的用法汇总

  8. js中getBoundingClientRect的作用及兼容方案

    js中getBoundingClientRect的作用及兼容方案 1.getBoundingClientRect的作用 getBoundingClientRect用于获取某个html元素相对于视窗的位 ...

  9. 分享一个自定义的 console 类,让你不再纠结JS中的调试代码的兼容

    问题的产生 在写JS的过程中,为了调试我们常常会写很多 console.log.console.info.console.group.console.warn.console.error代码来查看JS ...

随机推荐

  1. Java性能权威指南读书笔记--之一

    JIT(即时编译) 解释型代码:程序可移植,相同的代码在任何有适当解释器的机器上,都能运行,但是速度慢. 编译型代码:速度快,电视不同CPU平台的代码无法兼容. java则是使用java的编译器先将其 ...

  2. dubbo文档笔记

    配置覆盖关系 以 timeout 为例,显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似: 方法级优先,接口级次之,全局配置再次之. 如果级别一样,则消费 ...

  3. 使用Arthas 获取Spring ApplicationContext还原问题现场

    ## 背景 最近来了个实习僧小弟,安排他实现对目标网站 连通性检测的小功能,简单讲就是将下边的shell 脚本换成Java 代码来实现 ``` 1#!/bin/bash 2URL="http ...

  4. MobaXterm:远程终端登录软件封神选手

    提到SSH.Telnet等远程终端登录,我相信很多人想到的都是PuTTY PuTTY通常用于Windows,但实际上可以多平台运行,因此不表达为"Windows下的远程终端登录" ...

  5. Spark 系列(四)—— RDD常用算子详解

    一.Transformation spark 常用的 Transformation 算子如下表: Transformation 算子 Meaning(含义) map(func) 对原 RDD 中每个元 ...

  6. AWS Aurora数据库 Multi-Master 小测

    AWS Aurora Mysql终于推出了Multi-Master,直面硬刚Oracle RAC.在多一份数据库产品选择的小兴奋之余,我们也看看新推出的Multi-Master的特点(包括优缺点). ...

  7. opencv图像直方图均衡化及其原理

    直方图均衡化是什么有什么用 先说什么是直方图均衡化,通俗的说,以灰度图为例,原图的某一个像素为x,经过某个函数变为y.形成新的图.新的图的灰度值的分布是均匀的,这个过程就叫直方图均衡化. 图像直方图均 ...

  8. Java——反射:运行时的类信息

    RTTI的使用 如果不知道某个对象的确切类型,RTTI会告诉我们,但是有一个限制:这个类型在编译时必须已知,这样才能使用RTTI识别它,并利用这些信息做一些有用的事情.  2.什么情况下需要反射 假设 ...

  9. 7.18 collection time random os sys 序列化 subprocess 等模块

    collection模块 namedtuple 具名元组(重要) 应用场景1 # 具名元组 # 想表示坐标点x为1 y为2 z为5的坐标 from collections import namedtu ...

  10. 聊一聊 SpringBoot 自动配置的原理

    解析思路 我们建立好一个SpringBoot的工程后,我们将从启动类,SpringBootApplication开始进行探究. 开始解析 首先我们建立一个 Springboot的工程.找到启动类,我们 ...