在javascript中常见的浏览器兼容问题,以及解决方式。
在前端工作当中我们遵循这样的原则:渐进增强和优雅降级
 
渐进增强(progressive enhancement): 针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验
 
优雅降级(graceful degradation): 一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
 
 
1、获取非行内样式:
        函数getStyle(e,attr)第一个参数为需要获取样式的元素对象,第二个参数为样式的属性名(可以是一个对象数组)
        style 只能获取行内style,
        调用方式obj.style.属性
        兼容:所有都支持
 
        currentStyle() 可以获取该obj所有style,但是只可以读取,不可以设置
        调用方式:obj.currentStyle["属性"] 或者obj.currentStyle.属性
        兼容:只兼容ie6以上,不兼容其他浏览器
        getComputedStyle() 可以获取该obj所有style,只可以获取不能设置
        调用方式getComputedStyle(obj,null)[属性]或者getComputedStyle(obj,null).属性;
        兼容:兼容其他浏览器,IE浏览器只兼容ie9以上,
 
 
获取非行内样式兼容写法:
function getStyle(ele,attr){
    if(ele.currentStyle){
            return ele.currentStyle[attr] ;        //IE使用
    }else{
            return ele.getComputedStyle[attr];        //moz等其他浏览器使用
    }
}
 
 
2、事件冒泡与默认事件的兼容及方法说明:
 
阻止事件冒泡:
    阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你调用这个方法的时候,如果点击一个连接,这个连接仍然会被打开,所以一般配合默认事件一起使用。
 
e.stopPropagation()方法,取消事件冒泡对当前节点无影响
    符合w3c标准,适合谷歌火狐等浏览器,仅支持IE9以上版本
    
兼容IE事件对象:
    cancelBubble()返回的是一个布尔值,放在if语句里面判断 取消事件冒泡
       不符合W3C标准,只支持IE浏览器。
        从Chrome 58和Opera 45开始,谷歌和欧朋将此属性设置为false无效。
阻止事件冒泡兼容写法
function stopBubble(e){
    //判断浏览器
    if(e.stopPropagation){
        e.stopPropagation();                //moz等浏览器执行
    }else{
    //不是的话,使用cancelBubble方法
        e.cancelBubble = turn;              //IE浏览器使用 
}
 
阻止默认事件:
 
阻止右键菜单,阻止ctrl+c,阻止表单提交
        阻止默认事件的方法,调用此方法,连接不会被打开,但是会发生冒泡,冒泡会传递到上一层的父元素;
 
e.preventDefault() 
       兼容主流浏览器,兼容ie9以上浏览器
 
e.returnValue 
返回的是布尔值,在IE6以上浏览器可以兼容,在火狐浏览器中不支持
 
阻止默认事件的兼容写法
function stopDefault(e){
    if(e.preventDefault){        //moz等浏览器执行
            e.preventDefault()        
}else{
      e.returnValue = false;        //IE下执行
 
}
 
return false方式阻止冒泡和默认事件
会同时阻止事件冒泡和默认事件,相当于同时调用了event.stopPropagation()和event.preventDefault()
 
 
 
3、事件获取兼容
 
//IE是把event事件对象作为全局对象window的一个属性;可以使用event或window.event来访问;
//FireFox和Chrome等主流浏览器是通过把【事件对象】作为【事件响应函数】的【参数】进入传入的;
//兼容性的写法示例:
 
domElement.onclick = function( e ){
     var  e = e || window.event;    //或(||)书写顺序有讲究,不能随意换
}
 
事件获取兼容的三元表达式写法:
var  e = event ? event : event:window.event;
  
window.event
   
事件源的获取的兼容(事件委托机制)
e.target
e.srcElement
IE浏览器下没有target属性,只有srcElement属性,
FF浏览器则和IE浏览器相反
chrome下同时兼容两个方法
function foo(event){
    var evt = window.event||event;
    var targetObj = evt.target||evt.srcElement;
}
 
事件源的获取三元表达式写法:
    var targetobj = event.srcElement? event.srcElement : event.target;
 
 
4.事件绑定方式的兼容
 
DOM绑定事件
0级绑定事件
    // obox.onclick = function(){}
    删除事件
    element.onclick = null;
 
2级事件绑定(监听式事件绑定)
    2级事件绑定:可以重复绑定多个事件,但是存在兼容问题
    
    在IE浏览器中兼容:
    添加事件:obj.attachEvent(event,function)
    删除事件:obj.detachEvent(event,function)
    微软私有方法,火狐和其他浏览器不支持在IE浏览器中只有冒泡阶段,事件名需要加on;
    
    在其他浏览器兼容:
    添加事件:obj.addEventListener(type,listener,useCapture)
        type:事件的类型比如"click","mouseover"等等。
        listener:回调函数
         useCapture:用来确定是冒泡还是捕获,默认值是false,当为ture时是冒泡传递
     删除事件:obj.removeEventListener(type,listener)   
                type:需要删除的事件(事件句柄)
                listener:回调函数
 
事件绑定方式的兼容函数的封装
    function addEvent(obj,inci,back){
        if(obj.addEventListener){
            obj.addEventListener(inci,back);
        }else if(obj.attachEvent){
            obj.attachEvent("on" + inci,back);
        }else{
            obj["on"+inci] = back;
        }
    }
          
    function removeEvent(obj,inci,back){
        if(obj.removeEventListener){
            obj.removeEventListener(inci,back,false);
        }else if(obj.detachEvent){
            obj.detachEvent("on" + inci,back);
        }else{
            obj["on"+inci] = null;
        }
    }
 
 
5.其他一些兼容问题:
    
    滚动条兼容问题解决:
     document.documentElement.scrollTop||document.body.scrollTop
 
      网页可视区域兼容  
        window.innerHeight || document.documentElement.clientHeight
        window.innerWidth || document.documentElement.clientWidth
        
欢迎大家补充,以及错误指正。        
 
        

在javascript中的浏览器兼容问题以及兼容浏览器汇总(默认事件,阻止冒泡,事件监听。。。)以及解决方式详解的更多相关文章

  1. JavaScript 兼容各大浏览器阻止冒泡事件

    JavaScript 兼容各大浏览器阻止冒泡事件 function stopEvent(event) { //阻止冒泡事件 //取消事件冒泡 var e = arguments.callee.call ...

  2. JQuery阻止冒泡事件on绑定中异常情况分析

    科普下事件冒泡以及默认行为,以下面例子举列子:     事件冒泡:当点击内部button元素时,会触发自身及外层 a的点击事件,这就是事件冒泡引起的.事件会随着 DOM 的层次结构依次向上传播. 事件 ...

  3. DOM2级事件对象、添加事件、阻止默认事件、阻止冒泡事件、获取事件对象目标的兼容处理

    事件对象——兼容处理 /* * 功能: 事件对象兼容 * 参数: 表示常规浏览器的事件对象e */ function getEvent(e) { // 如果存在e存在,直接返回,否则返回window. ...

  4. JavaScript 各种遍历方式详解及总结

    JavaScript 各种遍历方式详解 在$.each中想要终止循环,但是它没有continue或者break这样的终止方式,所以尝试使用return来进行终止,但是发现并没有跳出循环.为了搞清楚js ...

  5. WPF中的事件及冒泡事件和隧道事件(预览事件)的区别

    WPF快速指导10:WPF中的事件及冒泡事件和隧道事件(预览事件)的区别   WPF快速指导10:WPF中的事件及冒泡事件和隧道事件(预览事件)的区别 本文摘要: 1:什么是路由事件: 2:中断事件路 ...

  6. JAVA中的四种JSON解析方式详解

    JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...

  7. WPF中的事件及冒泡事件和隧道事件的区别

    WPF中的事件及冒泡事件和隧道事件的区别 冒泡事件表示事件从元素树向上到达根元素.这样您就可以在源元素的上方层级对象处理事件.例如,您可向嵌入的 Grid 元素附加一个 Button.Click 处理 ...

  8. JavaScript中定义类的方式详解

    本文实例讲述了JavaScript中定义类的方式.分享给大家供大家参考,具体如下: Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的exte ...

  9. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

随机推荐

  1. 后端基于方法的权限控制--Spirng-Security

    后端基于方法的权限控制--Spirng-Security 默认情况下, Spring Security 并不启用方法级的安全管控. 启用方法级的管控后, 可以针对不同的方法通过注解设置不同的访问条件: ...

  2. 用CSS来定义<p>标签,要求实现以下效果:字体颜色再IE6下为黑色,IE7下为红色,IE8下为绿色,其他浏览器下为黄色。

    <!DOCTYPE html><html><head><meta charset="utf-8"><meta name=&qu ...

  3. oracle 删除用户,提示“无法删除当前已连接的用户”

    1. 首先查询出该用户的登录情况,注意用户名必须是大写 SQL> select username,sid,serial# from v$session where username = 'XST ...

  4. .net core web api部署到Linux系统CentOS 7

    一.创建一个.net core web api 的Demo 完成后的项目结构如图 修改下监听端口 发布代码 二.发布到CentOS 7上并运行 下一步需要一定的虚拟机知识了,我这里使用了windows ...

  5. 详解阿里P7架构师是怎么在Spring中实现事务暂停

    摘要 Spring框架是一个流行的基于轻量级控制反转容器的Java/J2EE应用框架,尤其在数据访问和事务管理方面的能力是众所周知的.Spring的声明性事务分离可以应用到任何POJO目标对象,并且包 ...

  6. struts与springmvc有何区别

    Struts2与SpringMVC有何区别? (1)SpringMVC的核心控制器是基于servlet技术,而Struts2是基于filter. (2)Struts2是类级别的拦截, 一个类对应一个r ...

  7. Opengl_入门学习分享和记录_番外篇00(MacOS上如何给Xcode 适配openGL)

    现在前面的废话:哇这次没有鸽太久,突然想起来还没有介绍如何适配opengl的衍生库.今天一并介绍下,同样看时间允不允许,让我再把之前学到的一些东西再次总结一遍. 正文开始: 首先大家要知道我们的Ope ...

  8. Transformation HDU - 4578(线段树——懒惰标记的妙用)

    Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, …, a n. The initial val ...

  9. 重读《学习JavaScript数据结构与算法-第三版》-第2章 ECMAScript与TypeScript概述

    定场诗 八月中秋白露,路上行人凄凉: 小桥流水桂花香,日夜千思万想. 心中不得宁静,清早览罢文章, 十年寒苦在书房,方显才高志广. 前言 洛伊安妮·格罗纳女士所著的<学习JavaScript数据 ...

  10. volatile关键字的详解-并发编程的体现

    xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! 参 ...