jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析


Posted in jQuery onApril 30, 2020

本文实例讲述了jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较。分享给大家供大家参考,具体如下:

前言:

最近在工作中做需求时发现了一个诡异的事情,在使用jQuery触发事件时,并不总是先执行默认行为,再执行绑定的事件行为,有时候可能是相反的顺序。于是上网查找了下资料,还真有个外国哥们和我遇到同一个问题!整理下笔记先~ ~

默认行为执行顺序

一般来说,浏览器执行事件的顺序是:先执行默认行为再执行绑定的行为。
可是在 jquery 中有些时候会出现相反的顺序,先执行绑定的行为,再执行默认行为。
那这里说的“有些时候”到底是什么时候呢?

看下面的代码示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>jQuery Trigger and Default Behavior Demo</title>
 
<script type="text/javascript" src="jquery-1.3.2.js"></script>
<script type="text/javascript">
 
// When the DOM is ready, initialize.
$(function(){
  $( "input" ).click(
    function( objEvent ){
      // Alert the checkboxed status.
      alert( this.checked );
    }
  );
   
  $( "button" ).click(
    function( objEvent ){
      // Trigger click on the checkbox.
      $( "input" ).click();
    }
  );
});
</script>
</head>
<body>
 
<h1>
jQuery Trigger and Default Behavior Demo
</h1>
 
<form>
<input type="checkbox" />
<button>click checkbox</button>
</form>
 
</body>
</html>

说明:页面中有2个元素,一个是 input 元素,一个是button 元素,并分别绑定了click 事件。当直接点击 input 元素时,alert结果为 true,input 的默认行为是在绑定的 click 事件之前发生的;当点击 button 元素时,alert结果却变成了 false,input 的默认行为是在绑定的 click 事件之后发生的;

细细体会其中的差别,发现当调用JQuery 的 $(selector) .click( )或者$(selector).trigger('click') 来触发 selector 元素的click事件时, 默认行为会在绑定的 click 事件之后发生。

那么如果我们希望,任何情况下默认行为都在绑定的 click 事件之前发生怎么做呢?

最简单的方法就是在触发 input 元素的 click 事件之前,手动设置 checkbox 的 checked 属性,然后通过 triggerHandler()来触发 click 事件(不触发浏览器的默认行为)。代码如下所示:

$( "input" ).click(
  function( objEvent ){
  // Alert the checkboxed status.
  alert( this.checked );
  }
);
$( "button" ).click(
  function( objEvent ){
  // Toggle checkbox checked status.
  $( "input" )[ 0 ].checked = !$( "input" )[ 0 ].checked;
  // Trigger ONLY click event hanlders on the checkbox.
  $( "input" ).triggerHandler( "click" );
  }
);

jQuery中 trigger( ) 与 triggerHandler( ) 区别

共同点:

  1. 都能触发通过 jquery 绑定的事件处理函数,如 .on()/.bind()/.click(function(){ })这些方式;

  2. 都能触发原生元素对象上的on{eventType}绑定的事件处理函数;

不同点:

  1. triggerHandler(‘event') 不会触发原生元素对象上的.event()方法(这种事件叫native event),而 trigger(‘event')则会;
    浏览器的默认行为其实是执行了原生元素对象上的.event()方法!!!

  2. .triggerHandler()只会触发第一个匹配的元素上的事件,而 trigger()会触发所有匹配元素的事件;

  3. .triggerHandler()触发的事件不会冒泡,而 trigger()会冒泡;

  4. .triggerHandler()返回值可以是任意值,如果没有明确 return 值,则为 undefined,而.trigger()永远返回 jQuery object。所以使用.triggerHandler()时链式调用得自己实现。

使用 trigger( )与triggerHandler( )注意事项

有一次我用 trigger('click')来触发点击事件时,鼠标并没有改变位置,也就是说鼠标焦点没有改变。测试了下发现,trigger( )与triggerHandler( )触发事件时并不会改变鼠标焦点,所以trigger('click')方式触发点击事件这种方式,还是和用户真正执行点击动作是不同的。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家jQuery程序设计有所帮助。

jQuery 相关文章推荐
jQuery实现动态生成表格并为行绑定单击变色动作的方法
Apr 17 jQuery
使用jQuery,Angular实现登录界面验证码详解
Apr 27 jQuery
jQuery设置图片等比例缩小的方法
Apr 29 jQuery
jQuery用户头像裁剪插件cropbox.js使用详解
Jun 07 jQuery
jquery-file-upload 文件上传带进度条效果
Nov 21 jQuery
jQuery实现form表单序列化转换为json对象功能示例
May 23 jQuery
JQuery通过后台获取数据遍历到前台的方法
Aug 13 jQuery
jQuery-Citys省市区三级菜单联动插件使用详解
Jul 26 jQuery
jQuery zTree插件使用简单教程
Aug 16 jQuery
jQuery实现提交表单时不提交隐藏div中input的方法
Oct 08 jQuery
jQuery实现数字华容道小游戏(实例代码)
Jan 16 jQuery
jQuery+ThinkPHP实现图片上传
Jul 23 jQuery
jQuery实现高度灵活的表单验证功能示例【无UI】
Apr 30 #jQuery
jQuery插件simplePagination的使用方法示例
Apr 28 #jQuery
jquery检测上传文件大小示例
Apr 26 #jQuery
jquery实现轮播图特效
Apr 12 #jQuery
用jQuery实现抽奖程序
Apr 12 #jQuery
jquery实现两个div中的元素相互拖动的方法分析
Apr 05 #jQuery
jQuery 图片查看器插件 Viewer.js用法简单示例
Apr 04 #jQuery
You might like
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
php使用Jpgraph创建3D饼形图效果示例
2017/02/15 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
任意位置显示html菜单
2007/02/01 Javascript
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
jQuery多个input求和的实现方法
2015/02/12 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
js滚动条平滑移动示例代码
2016/03/29 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
vue实现商品加减计算总价的实例代码
2018/08/12 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
微信小程序云开发之新手环境配置
2019/05/16 Javascript
[07:31]DOTA2卡尔工作室 英雄介绍主宰篇
2013/06/25 DOTA
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
python文件读取失败怎么处理
2020/06/23 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
H5仿微信界面教程(一)
2017/07/05 HTML / CSS
教师对学生的寄语
2014/04/03 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
个人主要事迹材料
2014/08/26 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
熟背这些句子,让您的英语口语突飞猛进(135句)
2019/09/06 职场文书