当前位置: 首页 > news >正文

事件绑定的几种常见方式

在项目开发中,经常遇到绑定事件不起作用,或者事件绑定多次,导致重复触发。

1.事件绑定的几种常见方式(以click事件为例)

jquery:

  $(selector).click(function(){...})

  $(selector).bind("click",function(){...})

  $(selector).live("click",function(){...})

  $(document).delegate("selector","click",function(){...})

$(selector).on("click",function(){...})

  虽然有以上四种基本方式绑定,但无论你用哪一种,底层实现都是由on事件绑定完成,唯一的区别就是书写方便和个人习惯而已。

  bind方法

  会给每一个符合selector的元素添加click执行函数,即:将click事件绑定到所有设置了的selector元素上,如果动态添加了元素,之前绑定事件也起作用

  live方法

  将事件绑定在document上,所有事件触发冒泡到根节点document的时候,判断是否为click事件、并且是否为selector元素都符合则执行事件函数

  delegate方法

  原理上delegate方法和live方法很类似,都是传递选择器和执行函数两个参数到document上判断,

$(document).delegate("selector","click",function(){...})

  约等于

$("selector").live("click",function(){...})

[注意:live事件,jQuery 1.7以后版本使用on代替live,且移动设备safari浏览器不支持live事件]

【穿插解决方案:

移动设备safari浏览器不支持live事件

方法一:

首先要给绑定click事件的元素加上样式:cursor: pointer;

然后再用live绑定事件

$('selector').live('click', function() {alert('你点我了'); })    

 

如果方法一对你无效,你也可以用

方法二:

同样也给绑定click事件的元素加上样式:cursor: pointer;

然后用on来绑定事件,jquery1.7后推荐用on来动态绑定事件,因为比live更高效

$(document).on('click', 'selector', function() {
            alert('你点我了');        
});    

】  

唯一的区别在于delegate的性能会比live稍好一些,因为live方法需要遍历整个dom去查selectordelegate只需要监测document就够了,想要更深入了解可以自己去网上查阅下。

  on方法

  on的绑定原理和bind差不多,但是on在性能上占优势。

2.事件重复绑定的可能原因

  大量使用ajax

  将所有事件写在一个大方法里,如:

  var clickEvent = function(){

    $(a).bind(...);

    $(b).bind(...);

  }

  在大量使用ajax时,为了触发事件会在success里调用clickEvent方法,然后由于其他地方需要触发同样的事件又会调用clickEvent,这样很容易导致多次触发。

  解决方案:避免这样使用

   嵌套元素的事件冒泡

  解决方案:

  e.preventDefault()//阻止默认

      e.stoppropagation()//阻止冒泡

   频繁使用trigger函数

  可能有时候的需求需要触发某个特定事件,这时我们会想当然使用trigger触发事件,但是却没有考虑到带来的隐患。尤其是一个事件去trigger另一个事件

解决方案:阻止事件冒泡,见上,

  或者使用triggerhandler(慎用,不支持chrome貌似)

Javascript事件绑定的几种方式

buttonClick事件为例:

<button id="btn">click me</button>

function clickBtn() {

    alert('click!');

}

1、直接在元素上绑定回调函数 <button id="btn" οnclick="clickBtn()">click me</button>

2JS获取DOM元素对象后,对onclick属性赋值,绑定事件:        document.getElementById('btn').οnclick=clickBtn;

3JS获取DOM对象后,调用对象的addEventListener函数绑定事件:document.getElementById('btn').addEventListener('click',clickBtn);

 

现阶段主流浏览器兼容的绑定事件方式就这3

转载于:https://www.cnblogs.com/beileixinqing/p/6503660.html

相关文章:

  • Connection Quality Indicator-Citrix VDA连接质量诊断工具
  • spark 02 操作算子
  • 轻松使用二进制安装Mysql5.6
  • rman RMAN-06059: expected archived log not found
  • Window下JDK、Tomcat、eclipse安装与配置
  • Remove Untagged Images From Docker
  • Error creating bean with name 'adminUserController': Injection of autowired dependencies failed;
  • [技术选型] spring boot
  • 学习JavaScript数据结构与算法 — 树
  • shell第一列相同即判断为重复,只取其中一条数据
  • BZOJ 4767: 两双手 [DP 组合数]
  • linux 调试 之printf
  • 普通函数和构造函数的区别
  • jwplayer 隐藏属性方法记载
  • hadoop2.7.3 HA高可用集群安装
  • 【译】JS基础算法脚本:字符串结尾
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [deviceone开发]-do_Webview的基本示例
  • Django 博客开发教程 16 - 统计文章阅读量
  • gf框架之分页模块(五) - 自定义分页
  • Git的一些常用操作
  • Travix是如何部署应用程序到Kubernetes上的
  • VUE es6技巧写法(持续更新中~~~)
  • 动态规划入门(以爬楼梯为例)
  • 机器学习中为什么要做归一化normalization
  • 力扣(LeetCode)22
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何使用 JavaScript 解析 URL
  • 实习面试笔记
  • 延迟脚本的方式
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 透过事物看本质的能力怎么培养?
  • #pragma multi_compile #pragma shader_feature
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (Forward) Music Player: From UI Proposal to Code
  • (NSDate) 时间 (time )比较
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (过滤器)Filter和(监听器)listener
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)Neo4j下载安装以及初次使用
  • (一一四)第九章编程练习
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET单元测试
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [BROADCASTING]tensor的扩散机制
  • [CentOs7]图形界面