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实现静态搜索功能(可输入搜索文字)
Mar 28 jQuery
jQuery实现Select下拉列表进行状态选择功能
Mar 30 jQuery
jQuery实现简单的抽奖游戏
May 05 jQuery
jQuery dateRangePicker插件使用方法详解
Jul 28 jQuery
jquery实现用户登陆界面(示例讲解)
Sep 06 jQuery
jquery实现侧边栏左右伸缩效果的示例
Dec 19 jQuery
通过jquery获取上传文件名称、类型和大小的实现代码
Apr 19 jQuery
jQuery+Datatables实现表格批量删除功能【推荐】
Oct 24 jQuery
详解jQuery中的getAll()和cleanData()
Apr 15 jQuery
jQuery内容选择器与表单选择器实例分析
Jun 28 jQuery
jQuery操作动画完整实例分析
Jan 10 jQuery
jQuery实现动态向上滚动
Dec 21 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实现的功能是显示8条基色色带
2006/10/09 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
jquery 查找新建元素代码
2010/07/06 Javascript
js中eval详解
2012/03/30 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
javascript基本类型详解
2014/11/28 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
Vue自定义指令封装节流函数的方法示例
2018/07/09 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
antd design table更改某行数据的样式操作
2020/10/31 Javascript
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
Python MD5文件生成码
2009/01/12 Python
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
解决pandas 作图无法显示中文的问题
2018/05/24 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
中学生学习生活的自我评价
2013/10/26 职场文书
行政专员岗位职责
2014/01/02 职场文书
普通员工辞职信
2014/01/17 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
2014光棍节大学生联谊活动方案
2014/10/10 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python