zoukankan      html  css  js  c++  java
  • 浏览器差异

    移动端浏览器没报错无法看报错信息
    移动端真机调试,引入vconsole

    <script src="vconsole.min.js"></script>
    <script>
      var vConsole = new VConsole();
    </script> 
    

      

    Array.prototype.slice.call(document.getElementById("test").childNodes);
    用上面的方法可以把 id 为 test 的子节点转换成数组

    IE8及之前不能直接这样使用

    解决方案

    function toArray(nodes) {
        var array = null;
        try {
            array = Array.prototype.slice.call(nodes);    //非IE
        } catch (e) {
            array = new Array();
            for (var i = 0; i < nodes.length; i++) {
                array.push(nodes[i]);
            }
        }
        return array;
    }
    

      


    事件处理
    IE8及之前不支持addEventListener。同时IE8及之前只支持时间冒泡,通过attachEvent()添加的事件程序会被添加到冒泡阶段。

    attachEvent和addEventListener 比较相似,除了attachEvent的事件参数都需要加上on ,事件触发的this指向的是window而不是被触发的元素作用域,绑定多个事件时顺序从后往前执行(和js原本的执行顺序相反)。

    解决方案

    /*
        * element传入的是获取到的元素 
        * type传入的是监听的事件
        * handler传入的是触发的函数
    */
    var EventUtil = {
        addHandler: function(element, type, handler) {
            if(element.addEventListener) {
                element.addEventListener(type, handler);
            } else if (element.attachEvent) {
                element.attachEvent("on" + type, handler);
            } else {
                element["on" + type] = handler;
            }
        },
        removeHandler: function(element, type, handler) {
            if(element.removeEventListener) {
                element.removeEventListener(type, handler);
            } else if (element.detachEvent) {
                element.detachEvent("on" + type, handler);
            } else {
                element["on" + type] = null;
            }
        }
    }
    

      

    事件对象属性差别
    IE中的事件对象是window.event,同时event.srcElement与DOM中的event.target相同。DOM 0级中,等于this。在DOM 2级中不等于this。

    var myBtn = document.getElementById('myBtn');
    myBtn.onclick = function(){
        console.log(this.innerText);    //正常内容,此时this指向window.event.srcElement
    };
    myBtn.attachEvent('onclick', function(event){
        console.log(this.innerText);    //undefinde,此时this指向的是document对象
    });
    

      

    IE的event.cancelBubble属性(赋值为true或false) 和 DOM里的event.stopPropagation() 相同

    IE的event.returnValue属性(赋值为true或false) 和 DOM里的event.preventDefault() 相同

    兼容性解决方案:

    var EventUtil = {
        getEvent: function(e) {
            return e ? e : window.event;
        },
        getTarget: function(e) {
            return e.target: e.srcElement; 
        },
        preventDefault: function(e) {
            if(e.preventDefault) {
                event.preventDefault();
            } else {
                event.returnValue = false;
            }
        },
        stopPropagation: function(e) {
            if(event.stopPropagation) {
                event.stopPropagation();
            } else {
                event.cancelBubble = true;
            }
        }
    }
    
    btn.onclick = function(e) {
        e = EventUtil.getEvent;
        EventUtil.stopPropagation(e);
    }
    

      


    事件区别

    鼠标滚轮事件

    大部分浏览器中滚轮事件为mousewheel,FireFox里是DOMMouseScroll。
    同时mousewheel往前是120的倍数,往后是-120的倍数。
    但是在FireFox里,往前滚是-3的倍数,往后滚是3的倍数。数值乘上40再将正负数对换解决兼容问题。

    键盘事件

    除了FireFox,向上键、向下键等特殊键不会触发keypress事件。

    现代浏览器按键字符编码是event.keyCode,IE8及之前用的是event.charCode。

    event.keyCode在Firefox里,字母及数字都为0,向上键、向下键等特殊键显示字符编码。而event.which 则是向上键向下键等特殊键都为0,字母及数字正常显示字符编码。

  • 相关阅读:
    【Android Developers Training】 85. 不要有冗余的下载
    【Android Developers Training】 84. 将定期更新的影响最小化
    【Android Developers Training】 83. 实现高效网络访问来优化下载
    【Android Developers Training】 82. 序言:传输数据时减少对电池寿命的影响
    【Android Developers Training】 81. 解析XML数据
    Linux下C程序进程地址空间布局[转]
    GNOME keyring [(null)] 的密码:
    Advanced Memory Allocation 内存分配进阶[转]
    Linux下进程信息的深入分析[转]
    安装juicer
  • 原文地址:https://www.cnblogs.com/NKnife/p/6089249.html
Copyright © 2011-2022 走看看