trigger()的event事件对象之坑

  • 问题引入,先贴一段有问题的代码,如果你对 trigger()  这个函数了解不透彻,还真看不出这段代码错在哪。完成的功能是样式转换器,想让页面在加载后自行触发点击事件隐藏三个按钮,但是效果如图并没有隐藏按钮们:控制台会报错: target  属性是 undefined ,肯定是 event 这个事件对象没获取到的问题,程序到17行出错停止,这让我感到疑问:自定义触发的事件难道没有event对象吗?。
 1 <div id="switcher" class="switcher">
 2     <h3>Style Switcher</h3>
 3     <button id="switcher-default">Default</button>
 4     <button id="switcher-narrow">Narrow</button>
 5     <button id="switcher-large">Large</button>
 6 </div>
 7 <script type="test/javascript">
 8 function func(){
 9     if(!$(event.target).is(‘button‘)){
10       $(‘#switcher button‘).toggle(‘slow‘);
11     }
12   }
13 function setBodyClass(classname){
14     //...
15 }
16 $(‘#switcher‘).on(‘click‘,function(){
17     if($(event.target).is(‘button‘)){
18       var classbody=event.target.id.split(‘-‘)[1];
19       setBodyClass(classbody);
20     }
21   }).on(‘click‘,func);
22 $(‘#switcher‘).trigger(‘click‘);
23 </script>
  • 问题思考,看看到底有没有事件对象, undefined 表明居然没有,千万别以为jQuery真的不支持自定义的事件对象其实这里是代码写的方式不对才导致 undefined ,后面会有详细代码验证!

    1 $(‘#switcher‘).on(‘click‘,function(){
    2     //if($(event.target).is(‘button‘)){
    3     // var classbody=event.target.id.split(‘-‘)[1];
    4     //setBodyClass(classbody);
    5     //}
    6      console.log(event);
    7    });
    8
    9 $(‘#switcher‘).trigger(‘click‘);

    迷惑不解的我查看了下jQuery官方文档最后一句说:“尽管 trigger() 模仿了激活事件的作用,完成与合成事件对象,它不完全复制的天然发生的事件”。为啥文档居然说有事件对象,只不过这个事件对象和天然的事件对象不一样。之前我还以为人工触发是不是就没有 event 事件对象,人工触发只是在机械地执行事件处理程序才导致的 undefined 。。。

As of jQuery 1.3, .trigger()ed events bubble up the DOM tree; an event handler can stop the bubbling by returning falsefrom the handler or calling the .stopPropagation() method on the event object passed into the event. Although .trigger()simulates an event activation, complete with a synthesized event object, it does not perfectly replicate a naturally-occurring event.

既然没有 event 就执行不了,那就造一个事件对象,看到官网给了这样的示例,自行创建一个 jQuery.Event() 的实例事件对象:

var event = jQuery.Event( "submit" );

$( "form:first" ).trigger( event );

if ( event.isDefaultPrevented() ) {

// Perform an action...

}

  • 问题验证,相应我的代码就要改成:(这也是创建 jQuery.Event 实例对象方式一)
 1 $(‘#switcher‘).on(‘click‘,function(event){
 2     if($(event.target).is(‘button‘)){
 3       var classbody=event.target.id.split(‘-‘)[1];
 4       setBodyClass(classbody);
 5     }
 6    console.log(event)
 7   }).on(‘click‘,func);
 8
 9 var e=jQuery.Event(‘click‘);//可以省略new 关键字
10 $(‘#switcher‘).trigger(e);

看看这个自创的事件对象是什么东西, target 属性终于是我想要的了。

  • 1.使用 triggle() 应注意的问题,同一个元素的自定义的触发代码要写在其绑定事件处理程序代码之后,不然执行自定义触发代码时找不到事件处理程序会告终而亡。

2.创建 jQuery.Event 实例对象方式二 ele.trigger(‘eventType‘) 直接创建

  //包含事件处理程序1 1 $(document).ready(function(){
 2     $(‘#switcher‘).trigger(‘click‘); 3 })  //包含事件处理程序2
 4 $(‘#switcher‘).on(‘click‘,function(){
 5      console.log(event);
 6     if($(event.target).is(‘button‘)){
 7       var classbody=event.target.id.split(‘-‘)[1];
 8       setBodyClass(classbody);
 9     }
10   })

 target 是 document ,可以看出 trigger() 如果不传参事件对象,则事件处理程序2的 event 是上一个事件对象即执行 $(‘#switcher‘).trigger(‘click‘); 所在事件处理程序1里的事件对象。若传了事件对象的参数则会将事件处理程序2中的默认传入的 event 覆盖掉成为新的由 trigger() 触发的事件对象(上面的 document 例子)或直接传入由 trigger() 触发的事件对象(事件处理程序2现在没有 event 所以不用覆盖,下面例子):

1 $(‘#switcher‘).on(‘click‘,function(event){
2       console.log(event);
3       if($(event.target).is(‘button‘)){
4         var classbody=event.target.id.split(‘-‘)[1];
5         // setBodyClass(classbody);
6       }
7    })
8 $(‘#switcher‘).trigger(‘click‘);

这个由 trigger() 触发得来的事件对象是 jQuery.Event() 的实例对象,看到 target 属性正确我就放心了。

  • 总结:创建自定义的事件对象有两种方式,你可以用 ele.trigger(‘eventType‘); 自定义触发事件(当然这句一执行就自动构造了一个 jQuery.Event 实例事件对象),也可以用不带 new 关键字构造事件对象。但传不传这个事件对象的参数就看你事件处理程序中需要不需要了,不传意味着事件处理程序里的 event 为 undefined (在不存在上一个事件对象情况下)或使用上一个 event 事件对象,传了就意味着事件处理程序中的事件对象是由 trigger() 得来的 jQuery.Event 实例对象。
  • 参考:http://api.jquery.com/trigger/
时间: 2024-10-24 10:14:12

trigger()的event事件对象之坑的相关文章

笔记-【3】-event事件对象的详解!

event事件对象:是指当前对象发生的事件的一些详细的信息在event这个对象里. event对象从哪里来?从事件函数中传入 obj. //e就会当前的事件对象event } 对象就有属性和方法:那么event对象也有属性和方法 event的属性和方法: { 属性: button :  当前事件的方法中判断鼠标的按键位置 有三个值: 0 (左键) 1(滚轮) 2(右键) ctrlkey:  判断是否按下了ctrl键; altkey:  判断是否按下了alt键; shiftkey:  判断是否按下

简单总结焦点事件、Event事件对象、冒泡事件

每学习一些新的东西,要学会复习,总结和记录. 今天来简单总结一下学到的几个事件:焦点事件.Event事件对象.冒泡事件 其实这几个事件应该往深的说是挺难的,但今天主要是以一个小菜的角度去尝试理解一些基本的知识点. 1.焦点事件: 1.1概念理解: 想象场景:当一堆text文本框出现在面前,当点击其中一个文本框,它就会响应用户,并出现光标闪动(这时,点击令它获得焦点). 所以说:焦点事件是用来让浏览器区分哪一个对象是用户要进行操作(输入值.选择.跳转)的. 总结===>  浏览器(区分)哪一个对象

event事件对象

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <script> /* event : 事件对象 , 当一个事件发生的时候,和当前这个对象发生的这个事件有关的一些详细的信息都会被临时保存到一个指定

event事件对象和clientX,clientY

一.event : 事件对象 , 当一个事件发生的时候,和当前这个对象发生的这个事件有关的一些详细的信息都会被临时保存到一个指定地方-event对象,供我们在需要的调用.如:飞机-黑匣子 事件对象必须在一个事件调用的函数里面使用才有内容 事件函数:事件调用的函数,一个函数是不是事件函数,不在定义的决定,而是取决于这个调用的时候 兼容 ie/chrome : event是一个内置全局对象 标准下 : 事件对象是通过事件函数的第一个参数传入 如果一个函数是被事件调用的那么,这个函数定义的第一个参数就

jquery之event与originalEvent的关系、event事件对象用法浅析

在jquery中,最终传入事件处理程序的 event 其实已经被 jQuery 做过标准化处理, 其原有的事件对象则被保存于 event 对象的 originalEvent 属性之中, 每个 event 都是 jQuery.Event 的实例 其原型链中保存有六个方法,  代码如下 复制代码 jQuery.Event.prototype = {     preventDefault: function() {         // 取消事件默认行为     },     stopPropagat

JavaScript中的Event事件对象详解

JavaScript事件[event] 在JavaScript中对于事件来讲,首先,我们需要了解这样几个概念:事件:事件处理程序:事件类型:事件流:事件冒泡:事件捕获:事件对象:浏览器内核:事件绑定:事件方面的性能优化(事件委托.移除事件处理程序):常见的浏览器兼容问题等. 什么是事件event: JavaScript事件是:浏览器.文档(document)窗口中的发生的特定的交互瞬间:而JavaScript和HTML之间的交互行为就是通过事件来触发的. 事件处理程序: 事件处理程序:我们用户在

(转)内核线程对象--Event事件对象

在所有的内核对象中,事件内核对象是个最基本的对象.事件能够通知一个操作已经完成. 客户机和一个服务器,它们之间需要互相进行通信例子(vs2008 ) 事件内核对象的组成 一个使用计数(与所有内核对象一样), 一个用于指明该事件是个自动重置的事件还是一个人工重置的事件的布尔值, 一个用于指明该事件处于已通知状态还是未通知状态的布尔值. 有两种不同类型的事件对象 一种是人工重置的事件,另一种是自动重置的事件. 当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程. 当自动重置的事件得到通

js的event事件对象汇总

JavaScript事件对象是浏览器默认传入的,但是对于浏览器的兼容问题,我们需要对事件对象进行兼容.但是jQuery已经帮我们解决了所有兼容性的问题,并且给我们添加了很多有用的方法.已经是比较历史的问题了,给大家提供参考.1.event.target 获取绑定事件的DOM元素2.event.type 获取事件的类型3.event.data 获取事件中传递的数据4.event.pagX/pagY 获取根据页面原点的X,Y值5.event.screenX/screenY 获取根据显示器窗口的X,Y

event事件对象的兼容

var event = { // 添加事件监听 add: function(element, type, callback){ if(element.addEventListener){ element.addEventListener(type, callback, false); } else if(element.attachEvent){ element.attachEvent('on' + type, callback); } else { element['on' + type] =