• JS-DOM2级事件对象跨浏览器处理(已封装)


     1 var eventUill = {
     2     //添加事件
     3     addHander: function(element, type, handler) {
     4         if(element.addEventListener) {
     5             element.addEventListener(type, handler, false);
     6         } else if(element.attachEvent) {
     7             element.attachEvent('on' + type, handler);
     8         } else {
     9             element['on' + type] = handler;
    10         }
    11     },
    12     //移除事件
    13     removeHander: function(element, type, handler) {
    14         if(element.removeEventListener) {
    15             element.removeEventListener(type, handler, false);
    16         } else if(element.detachEvent) {
    17             element.detachEvent('on' + type, handler);
    18         } else {
    19             element['on' + type] = handler;
    20         }
    21     },
    22     //获取到拥有这个事件的标签名称——事件对象(如input)
    23     getEvent: function(event){
    24         return event?event:window.event;//注意:返回后需要调用。可配合nodeName,来单独获取到标签的名字。
    25     },
    26     //获取事件的类型
    27     getType: function(event){
    28         return event.type;//注意:返回后需要调用。
    29     },
    30     //获取事件来自于哪个元素
    31     getElement: function(event){
    32         return event.target || event.srcElement;
    33     },
    34     //阻止、取消事件的默认行为/属性发生
    35     preventDefault: function(event){
    36         if(event.preventDefault){
    37             event.preventDefault();
    38         }else{
    39             event.returnValue = null;
    40         }
    41     },
    42     //阻止冒泡行为
    43     stopPropagation: function(event){
    44         if(event.stopPropagation){
    45             event.stopPropagation();
    46         }else{
    47             event.cancelBubble = true;
    48         }
    49     }
    50     
    51     
    52     
    53     
    54 }
    DOM2级事件对象的跨浏览器处理——js源码

    遇到的小bug总结:

    1.   封装的库根本找不到,颜色都是灰的,说明代码是错的,通过在js中添加了一个var eventUill = {},建立了一个对象,html这里调用对象的addHander,
    2.   eventUill找不到,发现,引用外部库的js代码写在来调用库中函数的下边,根据文档流的优先级,说明还没有调出eventUill之前就执行函数了所以出错。那就把调用的外部库写到最上面,让他优先调用。
    3.   addEventLister不对,把ele改成了element,是不是以后写,这里也必须写element呢?全部改成element后变绿了,代码正确。
    4.   说element为空。那么element接受传过来的参数是空的,但是html中的btn处是没有问题的,我getElementById的代码也没有错。看来是老毛病又犯了。js写在html上面,获取id为btn的按钮,根据文档流,他还没有读到input的时候就去获取,你让他去哪里获取。找不到btn,自然传过去的是undefined。紧接着element就成null了。解决就是加上window。onload=function(所有的js代码)调用id的代码写到html的下边。这也是js习惯上要放到body的后边的理由。

    以下是测试时的html文件,DOM2级事件-跨浏览器处理.js就是上面的js源码。

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="UTF-8">
            <title>dom2级事件跨浏览器处理-封装库</title>
            <script src="DOM2级事件-跨浏览器处理.js" type="text/javascript" charset="utf-8"></script>
            <script type="text/javascript">
                window.onload = function() {
                        var btn = document.getElementById('btn');
                        eventUill.addHander(btn, 'click', function() {
                            alert('点击后通过封装的库辗转调用了这个匿名函数');
                            alert(eventUill.getEvent(btn).nodeName);
                            alert(eventUill.getElement(btn));
                        });
                    }
            </script>
    
        </head>
    
        <body>
            <input type="button" value="点击" id="btn" />
        </body>
    
    </html>
    html
  • 相关阅读:
    sql order by 结合case when then
    若sql语句中order by指定了多个字段,怎么排序?
    sql 按字段指定值排序
    mybatis Condition查询
    java.lang.OutOfMemoryError: GC overhead limit exceeded
    Could not open JDBC Connection for transaction
    Lock wait timeout exceeded; try restarting transaction
    [转载]Windows x64下配置ffmpeg的方法
    java第七节 IO
    mysql触发器 学习
  • 原文地址:https://www.cnblogs.com/padding1015/p/5890679.html
Copyright © 2020-2023  润新知