zoukankan      html  css  js  c++  java
  • 事件监听

    事件监听

    1、为什么需要事件监听

    问题:我们可不可以为同一对象的同一事件绑定多个事件处理程序呢?

    答:不可以,因为后面的绑定会覆盖前面的绑定。如果在实际项目开发中,想为同一对象的同一事件绑定多个事件处理程序,可以使用事件监听。

    2、事件监听的定义方式

    由于Javascript是基于客户端浏览器的脚本语言,所以必须运行于不同的浏览器端,由于不同的浏览器具有不同的标准,所以其也可能会具有兼容性问题,但是在实际项目应用中,我们会把浏览器分为两大类:

    ① 基于IE内核的浏览器(IE8以下版本IE的浏览器、各种浏览器的兼容模式)

    ② 基于W3C内核的浏览器(火狐、谷歌、IE8以上版本的IE浏览器)

    所以Javascript的事件监听在不同内核浏览器下也有不同的创建方式:

    1)IE内核创建方式:

    dom对象.attachEvent(type,callback);

    参数说明:

    type:事件类型,带'on'前缀,如onclick/onmouseover/onmouseout

    callback:事件的处理程序,通常是一个匿名函数

    2)W3C内核创建方式:

    dom对象.addEventListener(type,callback,capture);

    参数说明:

    type:事件类型,不带'on'前缀,如click/mouseover/mouseout

    callback:事件的处理程序,通常是一个匿名函数

    capture(了解):使用的浏览器模型,冒泡模型与捕获模型,还要特别注意:在IE内核浏览器中其只支持冒泡模型。

    IE内核浏览器与W3C内核浏览器总结:

    ① 两者的绑定形式不同

    IE:attachEvent

    W3C:addEventListener

    ② 两者的参数不同

    addEventListener具有第三个参数,代表浏览器模型

    ③ type的参数不同

    IE:必须添加一个'on'前缀

    W3C:没有'on'前缀

    ④ 执行顺序不同

    IE:先绑定后触发

    W3C:先绑定先触发

    3、解决事件监听的兼容性问题

    ① 创建一个public.js文件作为Javascript核心库

    ② 定义一个$函数,用于获取指定id的dom对象

    ③ 创建一个公用函数,用于解决事件监听的兼容性问题

    解决事件监听的兼容性问题核心:判断浏览器的类型,如何判断浏览器类型?

    我们在事件绑定时使用的attachEvent与addEventListener都是以属性的形式进行绑定的,所以我们可以判断当前对象是否具有attachEvent或addEventListener属性。

    ④ 测试addEvent函数是否生效

    4、移除事件监听

    有些情况下,我们可能需要动态移除事件监听,这个时候可以使用以下方法:

    1)基于IE内核的浏览器

    添加:attachEvent(type,callback);

    移除:detachEvent(type,callback);

    参数说明:

    type:要移除的事件类型(带'on'前缀)

    callback:要移除的事件处理程序(必须是一个有名函数)

    2)基于W3C内核的浏览器

    添加:addEventListener(type,callback);

    移除:removeEventListener(type,callback);

    参数说明:

    type:要移除的事件类型(不带'on'前缀)

    callback:要移除的事件处理程序(必须是一个有名函数)

     

    特别说明:记住如果一个事件想移除,其在添加事件监听时,其事件处理程序必须是一个有名函数,否则是无法移除的。

    5、解决移除事件监听的兼容性问题

    ① 创建一个public.js公用文件作为Javascript代码库

    ② 在public.js文件中定义一个公用函数,用于解决移除事件监听的兼容性问题

    ③ 测试removeEvent方法是否可用

  • 相关阅读:
    MDX示例:求解中位数、四分位数(median、quartile)
    外部网关调用不到server端
    postgreSQL alter column data type to timestamp without time zone
    pgsql数据库创建序列
    Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.1.7.RELEASE:repackage failed: Unable to find main class -> [Help 1]
    微服务理论一
    使用svn提交本地任何位置的一个文件
    You have not concluded your merge. (MERGE_HEAD exists)
    org.springframework.web.bind.MissingPathVariableException: Missing URI template variable 'productCode' for method parameter of type String
    栏位索引超过许可范围:1,栏位数:0。; nested exception is org.postgresql.util.PSQLException: 栏位索引超过许可范围:1,栏位数:0。
  • 原文地址:https://www.cnblogs.com/nyxd/p/5364400.html
Copyright © 2011-2022 走看看