JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)


Posted in Javascript onDecember 31, 2013

首先这里声明一下,关于我测试浏览器的版本是chrome15.0.874.121 Firefox 8.01 IE9 IETester

下面的代码关于声明

1:获得滚动条的情况

function getScroll(){
        var t, l, w, h;        if (document.documentElement && document.documentElement.scrollTop) {
            t = document.documentElement.scrollTop;//滚动条的顶端
            l = document.documentElement.scrollLeft;//滚动条的左端
            w = document.documentElement.scrollWidth;//滚动条的宽度,也就是页面的宽度
            h = document.documentElement.scrollHeight;//滚动条的高度
        }
        else 
            if (document.body) {
                t = document.body.scrollTop;
                l = document.body.scrollLeft;
                w = document.body.scrollWidth;
                h = document.body.scrollHeight;
            }
        return {
            t: t,
            l: l,
            w: w,
            h: h
        };
    }

2:获得视图浏览器的宽度高度
  function getPageWidth(){
        var pageWidth = window.innerWidth;
        if (typeof pageWindth != "number") {
            if (document.compatMode == "CSS1Compat") {
                pageWidth = document.documentElement.clientWidth;
            }
            else {
                pageWidth = document.body.clientWidth;
            }
        }
        return pageWidth;
    }    function getPageHeight(){
        var pageHeight = window.innerHeight;
        if (typeof pageWindth != "number") {
            if (document.compatMode == "CSS1Compat") {
                pageHeight = document.documentElement.clientHeight;
            }
            else {
                pageHeight = document.body.clientHeight;
            }
        }
        return pageHeight;
    }

3:获得当前浏览器型号 名字
function(){
        var Sys = {};
        var ua = navigator.userAgent.toLowerCase();
        var s;
        (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] : (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] : (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] : (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] : (s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;        if (Sys.ie != null) {
            return ("IE:" + Sys.ie);//判断IE浏览器及版本号
        }
        if (Sys.firefox != null) {
            return ("firefox:" + Sys.firefox);//判断firefox浏览器及版本号
        }
        if (Sys.chrome != null) {
            return ("chrome:" + Sys.chrome);//判断chrome浏览器及版本号
        }
        if (Sys.opera != null) {
            return ("opera:" + Sys.opera);//判断opera浏览器及版本号
        }
        if (Sys.safari != null) {
            return ("safari:" + Sys.safari);//判断safari浏览器及版本号
        }
    }

4:事件监听
function(element, type, handler){
        if (element.addEventListener) {
            element.addEventListener(type, handler, false);
        }
        else 
            if (element.attachEvent) {
                element.attachEvent("on" + type, handler);
            }
            else {
                element["on" + type] = handler;
            }
    }

5:事件移除
function(element, type, handler){
        if (element.removeEventListener) {
            element.removeEventListener(type, handler, false);
        }
        else 
            if (element.detachEvent) {
                element.detachEvent("on" + type, handler);
            }
            else {
                element["on" + type] = null;
            }
    }

6:获得event,Firefox事件不断派发的时候,第一次事件会出现问题。
function(event){        event = (event ? event : window.event);
        if (event == null) {
            var $E = function(){
                var c = $E.caller;
                while (c.caller) 
                    c = c.caller;
                return c.arguments[0]
            };
            __defineGetter__("event", $E);
        }
        return event;
    }

7:阻止默认事件
function(event){
        if (event.preventDefault) {
            event.preventDefault();
        }
        else {
            event.returnValue = false;
        }
    }

8:不继续传播事件
function(event){
        if (event.stopPropagation) {
            event.stopPropagation();
        }
        else {
            event.cancelBubble = true;
        }
    }

9:获得event的target
function(event){
        return event.target || event.srcElement;
    }

10:documen.doctype支持不一致

E:如果存在文档类型说明,会将其错误的解释为一个注释并把它当做Comment节点,document.doctype的值始终是null。

Firefox:如果存在文档类型说明,则将其作为文档的第一个子节点,document.doctype是一个DocumentType节点,也可以通过firstChild或者childNodes[0]访问同一个节点。

Safari、Chrome、Opera:如果存在文档类型说明,则将其作为解释,但不作为文档的子节点,不会出现在childNodes中的。

11:查找元素
我有时候,我真搞不明白,IE总是在搞什么,总是想标新立异。如果系统不让自带浏览器的话,我敢说,IE的份额将会更少。

如果id和name一样的话,他也将被返回

<html>
    <head>
     <script defer>
      var item=document.getElementById("my");
   item.value="SECOND";     </script>
    </head>
    <body>
     <input type="text" name="my" value="FIRST" >
    </body>
</html>

在IE中,结果变化了。

同样是IE,Id大小写不区分

<html>
    <head>
     <script defer>
      var item=document.getElementById("MY");
   item.value="SECOND";     </script>
    </head>
    <body>
     <input type="text" id="my" value="FIRST" >
    </body>
</html>

不好意思,他的结果又变化了。

12:如果是自定义属性的话,item.myattributs在非IE浏览器的情况下,是无法得出正确结果的。

function(item,myatt){
  return item.attributes[myatt].value;
 }

同样的话,设置属性应该知道怎么办吧,就是赋值呗。
function(item,myatt,value){
  item.attributes[myatt].value=value;
 }

13:元素的子节点个数
 <ul id="myul">
   <li>first</li>
   <li>second</li>
   <li>third</li>
  </ul>

IE结果是3,其他浏览器是7。

Node之间的空白符,在其他浏览器是文本节点,结果就是7。如果变成这样,

<ul id="myul"><li>first</li><li>second</li><li>third</li></ul>

这样大家的结果都是3了。
14:创立节点问题
//动态添加Element,所有的浏览器都可以实现
var newnode=document.createElement("input");
newnode.type="button";
newnode.value="sixth";
//在IE中可以还这么实现
var newnode= document.createElement("<input type=\"button\">");

15:在屏蔽右键的时候,firefox与其他的不一样,在oncontextmenu事件中。

16:还有动态添加style和script的时候,IE和其他的浏览器是不一样的。具体查查。

17:对于DOM2和DOM3,情况更复杂了。

Javascript 相关文章推荐
javascript禁用键盘功能键让右击及其他键无效
Oct 09 Javascript
JS中把字符转成ASCII值的函数示例代码
Nov 21 Javascript
jquery实现瀑布流效果分享
Mar 26 Javascript
深入探讨javascript中的数据类型
Mar 04 Javascript
JS控制表格实现一条光线流动分割行的方法
Mar 09 Javascript
PassWord输入框代码分享
Jun 07 Javascript
用jQuery的AJax实现异步访问、异步加载
Nov 02 Javascript
从零学习node.js之详解异步控制工具async(八)
Feb 27 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
Aug 29 Javascript
微信小程序自定义弹窗实现详解(可通用)
Jul 04 Javascript
vscode vue 文件模板的配置方法
Jul 23 Javascript
基于JavaScript实现年月日三级联动
Jun 22 Javascript
IE与FireFox的JavaScript兼容问题解决办法
Dec 31 #Javascript
jquery遍历select元素(实例讲解)
Dec 31 #Javascript
在页面上用action传递参数到后台出现乱码的解决方法
Dec 31 #Javascript
获取鼠标在div中的相对位置的实现代码
Dec 30 #Javascript
input链接页面、打开新网页等等的具体实现
Dec 30 #Javascript
获取3个数组不重复的值的具体实现
Dec 30 #Javascript
改变隐藏的input中value的值代码
Dec 30 #Javascript
You might like
NO3第三帝国留言簿制作过程
2006/10/09 PHP
mysql总结之explain
2012/02/27 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
2016/02/26 PHP
PHP INT类型在内存中占字节详解
2019/07/20 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
JS 加入收藏夹的代码(主流浏览器通用)
2013/05/13 Javascript
关于JavaScript对象的动态选择及遍历对象
2014/03/10 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
jQuery实现摸拟alert提示框
2016/05/22 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
JS解决position:sticky的兼容性问题的方法
2017/10/17 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
python定时采集摄像头图像上传ftp服务器功能实现
2013/12/23 Python
python函数形参用法实例分析
2015/08/04 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
zooplus意大利:在线宠物商店
2019/08/07 全球购物
物业管理员岗位职责范文
2013/11/25 职场文书
大型活动策划方案
2014/01/12 职场文书
大二学期个人自我评价
2014/01/13 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
对照四风自我剖析材料
2014/10/07 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
东京审判观后感
2015/06/01 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书