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

时间:2024-02-26 10:24:28 

首先这里声明一下,关于我测试浏览器的版本是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,兼容,IE,firefox
0
投稿

猜你喜欢

  • Go语言包管理工具Godep的用法

    2024-02-20 04:09:44
  • my sql存储过程学习总结

    2011-07-12 19:12:35
  • PHP 使用header函数设置HTTP头的示例解析 表头

    2023-09-03 19:12:49
  • 如何把中文转换为UNICODE?

    2009-11-07 18:39:00
  • python字符串替换re.sub()实例解析

    2022-09-15 00:25:18
  • Docker 安装 MySQL(8和5.7)

    2024-01-26 06:49:48
  • python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例

    2021-04-26 09:11:26
  • DataGrip 2020.1 安装与激活方法

    2022-04-02 19:46:16
  • Python实现将xml导入至excel

    2023-10-01 06:17:45
  • python装饰器代替set get方法实例

    2023-01-25 15:40:37
  • django使用F方法更新一个对象多个对象字段的实现

    2021-07-20 10:38:42
  • Python弹出输入框并获取输入值的实例

    2021-04-05 00:49:10
  • 教你用scrapy框架爬取豆瓣读书Top250的书类信息

    2022-11-04 12:48:23
  • python七种方法判断字符串是否包含子串

    2023-09-19 04:06:20
  • MySQL8.0/8.x忘记密码更改root密码的实战步骤(亲测有效!)

    2024-01-27 07:04:26
  • Tensorflow 卷积的梯度反向传播过程

    2021-02-05 09:15:29
  • 图片格式与设计那点事儿

    2011-01-06 12:17:00
  • 解决MySQL添加新用户-ERROR 1045 (28000)的问题

    2024-01-15 22:56:29
  • python之模拟鼠标键盘动作具体实现

    2022-12-23 10:51:29
  • 如何在django中实现分页功能

    2021-10-21 03:29:49
  • asp之家 网络编程 m.aspxhome.com