关闭

JS中常遇到的浏览器兼容问题和解决方法

259人阅读 评论(0) 收藏 举报
分类:

转载注:下面的示例有些无法实现需求,请大家参考的过程中多动手试一下。

例如document.body.clientWidth便无法获取网页可见区的宽度。

getElementsByClassName()在Firefox中也不支持。

常遇到的关于浏览器的宽高问题:

//以下均可console.log()实验
    var winW=document.body.clientWidth||document.docuemntElement.clientWidth;//网页可见区域宽
    var winH=document.body.clientHeight||document.docuemntElement.clientHeight;//网页可见区域宽
    //以上为不包括边框的宽高,如果是offsetWidth或者offsetHeight的话包括边框
    
    var winWW=document.body.scrollWidth||document.docuemntElement.scrollWidth;//整个网页的宽
    var winHH=document.body.scrollHeight||document.docuemntElement.scrollHeight;//整个网页的高


    var scrollHeight=document.body.scrollTop||document.docuemntElement.scrollTop;//网页被卷去的高
    var scrollLeft=document.body.scrollLeft||document.docuemntElement.scrollLeft;//网页左卷的距离


    var screenH=window.screen.height;//屏幕分辨率的高
    var screenW=window.screen.width;//屏幕分辨率的宽
    var screenX=window.screenLeft;//浏览器窗口相对于屏幕的x坐标(除了FireFox)
    var screenXX=window.screenX;//FireFox相对于屏幕的X坐标
    var screenY=window.screenTop;//浏览器窗口相对于屏幕的y坐标(除了FireFox)
    var screenYY=window.screenY;//FireFox相对于屏幕的y坐标

event事件问题:

//event事件问题
    document.onclick=function(ev){//谷歌火狐的写法,IE9以上支持,往下不支持;
        var e=ev;
        console.log(e);
    }
    document.onclick=function(){//谷歌和IE支持,火狐不支持;
        var e=event;
        console.log(e);
    }
    document.onclick=function(ev){//兼容写法;
        var e=ev||window.event;
        var mouseX=e.clientX;//鼠标X轴的坐标
        var mouseY=e.clientY;//鼠标Y轴的坐标
    }


DOM节点相关的问题,我直接封装了函数,以便随时可以拿来使用:

//DOM节点相关,主要兼容IE 6 7 8
    function nextnode(obj){//获取下一个兄弟节点
        if (obj.nextElementSibling) {
            return obj.nextElementSibling;
        } else{
            return obj.nextSibling;
        };
    }
    function prenode(obj){//获取上一个兄弟节点
        if (obj.previousElementSibling) {
            return obj.previousElementSibling;
        } else{
            return obj.previousSibling;
        };
    }
    function firstnode(obj){//获取第一个子节点
        if (obj.firstElementChild) {
            return obj.firstElementChild;//非IE678支持
        } else{
            return obj.firstChild;//IE678支持
        };
    }
    function lastnode(obj){//获取最后一个子节点
        if (obj.lastElementChild) {
            return obj.lastElementChild;//非IE678支持
        } else{
            return obj.lastChild;//IE678支持
        };
    }

document.getElementsByClassName问题:
//通过类名获取元素
    document.getElementsByClassName('');//IE 6 7 8不支持;


    //这里可以定义一个函数来解决兼容问题,当然别在这给我提jQuery...
    //第一个为全局获取类名,第二个为局部获取类名
    function byClass1(oClass){//全局获取,oClass为你想要查找的类名,没有“.”
        var tags=document.all?document.all:document.getElementsByTagName('*');
        var arr=[];
        for (var i = 0; i < tags.length; i++) {
            var reg=new RegExp('\\b'+oClass+'\\b','g');
            if (reg.test(tags[i].className)) {
                arr.push(tags[i]);
            };
        };
        return arr;//注意返回的也是数组,包含你传入的class所有元素;
    }


    function byClass2(parentID,oClass){//局部获取类名,parentID为你传入的父级ID
        var parent=document.getElementById(parentID);
        var tags=parent.all?parent.all:parent.getElementsByTagName('*');
        var arr=[];
        for (var i = 0; i < tags.length; i++) {
        var reg=new RegExp('\\b'+oClass+'\\b','g');
            if (reg.test(tags[i].className)) {
                arr.push(tags[i]);
            };
        };
        return arr;//注意返回的也是数组,包含你传入的class所有元素;
     }

获取元素的非行间样式值:
//获取元素的非行间样式值
     function getStyle(object,oCss) {
             if (object.currentStyle) {
                 return object.currentStyle[oCss];//IE
             }else{
                 return getComputedStyle(object,null)[oCss];//除了IE
             }
     }

设置监听事件:
//设置监听事件
     function addEvent(obj,type,fn){//添加事件监听,三个参数分别为 对象、事件类型、事件处理函数,默认为false
        if (obj.addEventListener) {
            obj.addEventListener(type,fn,false);//非IE
        } else{
            obj.attachEvent('on'+type,fn);//ie,这里已经加上on,传参的时候注意不要重复加了
        };
    }
    function removeEvent(obj,type,fn){//删除事件监听
        if (obj.removeEventListener) {
            obj.removeEventListener(type,fn,false);//非IE
        } else{
            obj.detachEvent('on'+type,fn);//ie,这里已经加上on,传参的时候注意不要重复加了
        };
    }

元素到浏览器边缘的距离:
//在这里加个元素到浏览器边缘的距离,很实用
    function offsetTL(obj){//获取元素内容距离浏览器边框的距离(含边框)
        var ofL=0,ofT=0;
        while(obj){
            ofL+=obj.offsetLeft+obj.clientLeft;
            ofT+=obj.offsetTop+obj.clientTop;
            obj=obj.offsetParent;
        }
        return{left:ofL,top:ofT};
    }

阻止事件传播:
//js阻止事件传播,这里使用click事件为例
    document.onclick=function(e){
        var e=e||window.event;
        if (e.stopPropagation) {
            e.stopPropagation();//W3C标准
        }else{
            e.cancelBubble=true;//IE....
        }
    }

阻止默认事件:
//js阻止默认事件
    document.onclick=function(e){
        var e=e||window.event;
        if (e.preventDefault) {
            e.preventDefault();//W3C标准
        }else{
            e.returnValue='false';//IE..
        }
    }


关于EVENT事件中的target:
//关于event事件中的target
    document.onmouseover=function(e){
        var e=e||window.event;
        var Target=e.target||e.srcElement;//获取target的兼容写法,后面的为IE
        var from=e.relatedTarget||e.formElement;//鼠标来的地方,同样后面的为IE...
        var to=e.relatedTarget||e.toElement;//鼠标去的地方
    }

鼠标滚轮滚动事件:
//鼠标滚轮事件
    //火狐中的滚轮事件
    document.addEventListener("DOMMouseScroll",function(event){
        alert(event.detail);//若前滚的话为 -3,后滚的话为 3
    },false)
    //非火狐中的滚轮事件
    document.onmousewheel=function(event){
        alert(event.detail);//前滚:120,后滚:-120
    }

节点加载:

//火狐下特有的节点加载事件,就是节点加载完才执行,和onload不同
    //感觉用到的不多,直接把js代码放在页面结构后面一样能实现。。
    document.addEventListener('DOMContentLoaded',function ( ){},false);//DOM加载完成。好像除IE6-8都可以.

原文地址:http://www.cnblogs.com/duenyang/p/6066737.html

0
0
查看评论

[JavaScript]JS中常遇到的浏览器兼容问题和解决方法

JS中常遇到的浏览器兼容问题和解决方法 今天整理了一下浏览器对JS的兼容问题,希望能给你们带来帮助,我没想到的地方请留言给我,我再加上; 常遇到的关于浏览器的宽高问题: //以下均可console.log()实验 v...
  • slqgenius
  • slqgenius
  • 2017-04-01 13:44
  • 757

谈谈JS中常遇到的浏览器兼容问题和解决方法

http://www.cnblogs.com/duenyang/p/6066737.html 今天整理了一下浏览器对JS的兼容问题,希望能给你们带来帮助,我没想到的地方请留言给我,我再加上; 常遇到的关于浏览器的宽高问题: //以下均可console.log()实验 ...
  • sinat_17775997
  • sinat_17775997
  • 2017-09-19 10:06
  • 344

JS中常遇到的浏览器兼容问题和解决方法

今天整理了一下浏览器对JS的兼容问题,希望能给你们带来帮助,我没想到的地方请留言给我,我再加上; 常遇到的关于浏览器的宽高问题: //以下均可console.log实验 var winW=document.body.clientWidth||document.docuemntElement....
  • xiaoyao8903
  • xiaoyao8903
  • 2016-11-20 21:25
  • 348

浏览器兼容性问题以及解决方法1

前端工程师在开发的过程中,遇到最头疼的莫过于是浏览器的兼容性问题,常常为了实现一个兼容各种浏览器的效果绞尽脑汁。我们平时在写前端代码的时候,在排版时也是会遇到各种兼容性问题,尤其是老板要求要兼容IE5、IE6、IE7的时候。接下来我总结几个我遇到的兼容性问题以及解决方法,后续遇到会慢慢更新。 1、H...
  • u010297791
  • u010297791
  • 2017-02-10 17:15
  • 557

Javascript中常遇到的浏览器兼容问题和解决方法

常遇到的关于浏览器的宽高问题: 复制代码 //以下均可console.log()实验 var winW=document.body.clientWidth||document.docuemntElement.clientWidth;//网页可见区域宽 var winH=document.body....
  • smartsmile2012
  • smartsmile2012
  • 2016-12-30 11:18
  • 360

前端开发中常遇到的浏览器兼容问题小结

web前端开发的浏览器兼容问题总结
  • AnterWang
  • AnterWang
  • 2016-11-25 18:04
  • 5462

js 关于BOM浏览器兼容问题 函数封装

1.    作用:获取可视区宽度(兼容所有浏览器)        返回值:获取可视区宽度 function getWidth(){ if(window.innerWidth){ return window.innerWid...
  • b1244154318
  • b1244154318
  • 2016-07-16 16:54
  • 310

PC端浏览器常见兼容问题及解决方案

PC端浏览器常见兼容问题及解决方案一、IE6的特殊样式1.IE6块级元素设置float之后,设置的横向margin样式margin加倍debug: 将该块级元素设置样式 display:inline 2.IE6默认有行高debug: overflow:hidden;或者font-size:0;或者...
  • TJ_DS
  • TJ_DS
  • 2016-11-12 09:58
  • 2542

常见的浏览器兼容性问题总结(有自己遇到的还有网上大神总结的)

常见的浏览器兼容性问题总结 1. 不同浏览器的标签默认外补丁margin和内补丁padding不同 发生概率:100% 解决方案:使用CSS通配符*,设置内外补丁为0 *{ margin: 0; padding: 0;} 2.  块属性标签float之后,又有横向的margin值...
  • zhuwanwanshay
  • zhuwanwanshay
  • 2016-07-11 18:02
  • 1712

前端js与css兼容性问题

前言 浏览器兼容是前端开发人员必须掌握的一个技能,但是初入前端的同学或者其他后台web开发同学往往容易选择忽略,而形成两个极端: 1 我最开始都是使用IE6,IE6上没问题,其它浏览器坑爹(多出现与前端后端一起搞的同学,小生2年前就这种状态,鼓励人家用ie6.。。。) 2 我要遵循...
  • u598975767
  • u598975767
  • 2016-04-25 16:02
  • 4382
    个人资料
    • 访问:192315次
    • 积分:3427
    • 等级:
    • 排名:第11590名
    • 原创:145篇
    • 转载:109篇
    • 译文:0篇
    • 评论:4条
    最新评论