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获取单选按钮radio选中值与去除所有radio选中状态的方法
May 20 jQuery
jQuery实现动态删除LI的方法
May 30 jQuery
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
jquery一键控制checkbox全选、反选或全不选
Oct 16 jQuery
jquery.picsign图片标注组件实例详解
Feb 02 jQuery
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 jQuery
深入浅析angular和vue还有jquery的区别
Aug 13 jQuery
jQuery中$原理实例分析
Aug 13 jQuery
JS拖动选择table里的单元格完整实例【基于jQuery】
May 28 jQuery
JQuery基于FormData异步提交数据文件
Sep 01 jQuery
jquery实现简单每周轮换的日历
Sep 10 jQuery
jquery实现简易验证插件封装
Sep 13 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下批量挂马和批量清马代码
2011/02/27 PHP
Apache服务器无法使用的解决方法
2013/05/08 PHP
PHP中array_map与array_column之间的关系分析
2014/08/19 PHP
PHP+jquery实时显示网站在线人数的方法
2015/01/04 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
PHP实现将标点符号正则替换为空格的方法
2017/08/09 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
2010/11/05 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
使用nodeJs来安装less及编译less文件为css文件的方法
2017/11/20 NodeJs
vuex state及mapState的基础用法详解
2018/04/19 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
js array数组对象操作方法汇总
2019/03/18 Javascript
vue自定义组件实现双向绑定
2021/01/13 Vue.js
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python局部赋值的规则
2013/03/07 Python
Python re模块介绍
2014/11/30 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
使用GitHub和Python实现持续部署的方法
2019/05/09 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
策划主管的工作职责
2013/11/24 职场文书
优秀求职信范文分享
2013/12/19 职场文书
舞蹈教师自荐信
2014/01/27 职场文书
市场专员岗位职责
2014/02/14 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
九年级数学教学反思
2016/02/17 职场文书