zoukankan      html  css  js  c++  java
  • js事件(十二)

    一、事件三要素
    1、事件目标【谁触发的该事件(引起该事件触发的源头:target)】
    2、事件处理程序【处理相应事件的函数】
    3、事件对象【触发事件产生的携带事件信息的对象】

    二、事件流【从页面中接受事件的顺序】
    1、事件捕获流    相同事件从外到内依次执行
    2、事件冒泡流    相同事件从内到外依次执行
    3、DOM事件流    先事件捕获,再处理目标,再冒泡

    三、事件处理程序
    1.HTML事件处理程序【HTML特性来指定
    eg:

        <div onclick="test()"></div>
        <script type="text/javascript">
            function test(){};
        </script>

    缺点:
    1)时差问题:可能在加载页面是无意间就触发相应的事件处理程序。
    2)兼容性问题:存在浏览器兼容性问题。
    3)代码划分问题:HTML与JavaScript代码紧密耦合。
        
    2.DOM0级的事件处理程序【相应元素指定,this指向事件绑定元素】(特点是简单,跨浏览器。)
    eg:

        var div = document.getElementsByTagName("div")[0];
        div.onclick = function(){};
        div.onclick = null;        //事件解除绑定    

    说明:
    可以同一元素添加多个相同类型的事件,但后面的相同的事件会覆盖前面的事件【同一元素相同事件只会执行一次】   

    3.DOM2级事件处理程序

        function handle(){};    //事件处理函数

    a、非ie8以下浏览器    【不要对事件使用 "on" 前缀    eg:请使用 "click" 代替 "onclick"
    addEventListener(事件名,事件处理函数,布尔值)    事件绑定
    eg:

        div.addEventListener('click',handle,false);

    removeEventListener(事件名,事件处理函数,布尔值)    事件解绑
    eg:

        div.removeEventListener('click',handle,false);

    函数说明:
    布尔值:true在捕获阶段调用事件处理程序;false在冒泡阶段调用事件处理程序(默认为:false)
    可以同一元素添加多个相同类型的事件,并且按照她们添加的的顺序依次触发执行
    添加事件时如果使用匿名函数将无法删除

    b、ie8及以下浏览器【事件名:要添加on在前面
    attachEvent(事件名,事件处理函数,布尔值)    事件绑定
    eg:

        div.attachEvent('onclick',handle,false);

    detachEvent(事件名,事件处理函数)    事件解绑
    eg:

        div.detachEvent('onclick',handle,false);  

    函数说明:
    布尔值:true在捕获阶段调用事件处理程序;false在冒泡阶段调用事件处理程序(默认为:false)
    如果同一节点同一事件绑定多个事件处理程序,逆序执行

    四、事件对象里面的属性均为只读
    1、DOM中的事件对象【event
    currentTarget    [Element]    事件处理程序当前正在处理事件的那个元素【绑定该事件处理程序的元素
    target    [Element]    事件真正目标【引发事件发生的源头
    preventDefault()    [Function]    取消事件的默认行为
    stopPropagation()    [Function]    取消事件的进一步捕获或者冒泡
    bubbles  [Boolean]    事件是否冒泡
    cancelable    [Boolean]    是否可取消事件默认行为
    说明:
    a、在事件处理程序内部,对象this===currentTarget值,而target则只包含事件的实际目标。
    b、如果直接将事件处理程序指定给了目标元素,this,currentTarget,target包含相同的值。
    c、兼容DOM的浏览器默认会将event对象传入到事件处理函数中

    2、ie(COM)中的事件对象【window.event】opera也是使用window.event
    type  [String]        被触发的事件 的类型
    srcEvent  [Element]        事件的目标 【类似target
    returnValue  [Boolean]        取消时间默认行为,值为false阻止【类似preventDefault()
    cancelBubble  [Boolean]        是否取消事件冒泡,值为true取消冒泡【类似stopPropagation()

    3、js中兼容性处理问题
    对相关兼容性问题封装为对象的相关方法
    eg:

        //事件兼容性对象eventUtil
        var eventUtil = {
            // 1.事件的绑定
            bind:function(el,type,handle){
                if (el.addEventListener) {
                    //非ie8及以下浏览器
                    el.addEventListener(type,handle);
                }else if(el.attachEvent){
                    //ie8及以下浏览器
                    el.attachEvent('on'+type,handle);
                }else{
                    el.['on'+type] = handle;
                }
            },
            // 2.事件的解绑
            unbind:function(el,type,handle){
                if (el.removeEventListener) {
                    //非ie8及以下浏览器
                    el.removeEventListener(type,handle);
                }else if(el.detachEvent){
                    //ie8及以下浏览器
                    el.detachEvent('on'+type,handle);
                }else{
                    el.['on'+type] = null;
                }
            },
            // 3.事件对象
            getEvent:function(event){
                //ie及opera使用window.event;其他基本使用event
                return event?event:window.event;
            },
            // 4.事件目标
            getTarget:function(event){
                //ie使用srcElement;DOM中事件对象使用target
                return event.target?event.target:event.srcElement;
            },
            // 5.事件冒泡
            stopProp:function(event){
                if(event.stopPropagation){
                    //DOM事件对象下使用
                    event.stopPropagation();
                }else{
                    //ie下使用cancelBubble
                    event.cancelBubble = true;
                }
            },
            // 6.事件默认
            preventDef:function(event){
                if (event.preventDefault) {
                    event.preventDefault();
                }else{
                    event.returnValue = false;
                }
            }
        };
    封装对象 Code
  • 相关阅读:
    (一)主动学习概念与技术
    mybatis 分页插件PageHelper 使用方法
    单例模式-Singleton
    解决tomcat启动报 java.lang.IllegalArgumentException: Invalid <url-pattern> login in servlet mapping
    如何在MSDN上获取Win7镜像
    解决 Could not find resource com/baidou/dao/UserMapper.xml
    4、XML 配置
    3、使用Map传参 & 模糊查询
    图解python环境搭建
    2、CRUD
  • 原文地址:https://www.cnblogs.com/nzcblogs/p/11226599.html
Copyright © 2011-2022 走看看