博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
trigger()的event事件对象之坑
阅读量:5258 次
发布时间:2019-06-14

本文共 3128 字,大约阅读时间需要 10 分钟。

  • 问题引入,先贴一段有问题的代码,如果你对 trigger()  这个函数了解不透彻,还真看不出这段代码错在哪。完成的功能是样式转换器,想让页面在加载后自行触发点击事件隐藏三个按钮,但是效果如图并没有隐藏按钮们:控制台会报错: target  属性是 undefined ,肯定是 event 这个事件对象没获取到的问题,程序到17行出错停止,这让我感到疑问:自定义触发的事件难道没有event对象吗?。
1 
2

Style Switcher

3
4
5
6
7
  • 问题思考,看看到底有没有事件对象, 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   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 实例对象。
  • 参考:

 

转载于:https://www.cnblogs.com/venoral/p/5181933.html

你可能感兴趣的文章
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
爬虫-通用代码框架
查看>>
2019春 软件工程实践 助教总结
查看>>
YUV 格式的视频呈现
查看>>
现代程序设计 作业1
查看>>
在android开发中添加外挂字体
查看>>
Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
查看>>
多线程实现资源共享的问题学习与总结
查看>>
java实现哈弗曼树
查看>>
转:Web 测试的创作与调试技术
查看>>
python学习笔记3-列表
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>
线程androidAndroid ConditionVariable的用法
查看>>
转载:ASP.NET Core 在 JSON 文件中配置依赖注入
查看>>
socket初识
查看>>