在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. C#:正则表达式类

     Regex r = new Regex("abc"); // 定义一个Regex对象实例(Regex r = new Regex("abc", RegexOp ...

  2. JVM和GC的工作原理

    转载于https://uestc-dpz.github.io JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM ...

  3. PHP 的一些底层知识

    本篇内容比较干涩,请自备矿泉水 文章分6个主题进行讲解 PHP运行机制和原理 PHP底层变量数据结构 PHP传值赋值中的COW特性 PHP垃圾回收机制 PHP中数组底层分析 PHP数组函数分类 PHP ...

  4. JavaScript数据结构——树的实现

    在计算机科学中,树是一种十分重要的数据结构.树被描述为一种分层数据抽象模型,常用来描述数据间的层级关系和组织结构.树也是一种非顺序的数据结构.下图展示了树的定义: 在介绍如何用JavaScript实现 ...

  5. Vue系列:.sync 修饰符的作用及使用范例

    作用:对传递给子组件的 prop 数据进行“双向绑定”.(正常情况下,prop 的数据都是单向数据流) 代码参考如下: 父组件部分 子组件部分

  6. CSS3: @font-face 介绍与使用

    @font-face 是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有 ...

  7. 洛谷 P3628 特别行动队

    洛谷题目页面传送门 题意见洛谷. 这题一看就是DP... 设\(dp_i\)表示前\(i\)个士兵的最大战斗力.显然,最终答案为\(dp_n\),DP边界为\(dp_0=0\),状态转移方程为\(dp ...

  8. 解决mysql乱码

    总结的几个乱码问题 希望我们全体学员也能够学会总结 java web 很是希望大家能够学好.并且也希望大家能够在学习过程中不段的积累相关的知识点 1.在response中写<meta  http ...

  9. Django之ORM-model模型关系

    模型类关系 1)一对多关系例:图书类-英雄类 models.ForeignKey() 定义在多的类中. 2)多对多关系例:新闻类-新闻类型类 体育新闻 国际新闻models.ManyToManyFie ...

  10. c++ 左移

    maxval = (1 << d) - 1: d=8 意思是2^d-1,相当于1左移d位