案例:B站直播间弹幕轰炸跳过按键监听办法:

var event = document.createEvent('Event');
event.initEvent('input', true, true);setInterval(()=>{$('.chat-input.border-box').val("文本内容");$('.chat-input.border-box')[0].dispatchEvent(event);document.querySelector('.bl-button').click();
},1000);
  • $('.chat-input.border-box')[0].dispatchEvent(event);:里面加[0]索引号的意思是jquery转换为Dom对象需要加[]索引号,成为伪数组
 //1. DOm对象转换成jquery对象//(1) 我们直接获取视频  得到jquery对象$('video');//(2)我们可以使用原生js 获取过来 DOm对象var myvideo = document.querySelector('video');// $('video').play();jQuery里面的没有play 这个方法myvideo.play();//2 jquery 对象转换为Dom对象$('video')[0].play(); //转化成dom对象 []索引号  伪数组$('video').get(0).play(); //第二种转化方法

一、element.dispatchEvent()

对于标准浏览器,其提供了可供元素触发自定义事件的方法:element.dispatchEvent().
不过,在使用该方法之前,我们还需要做其他两件事,即创建和初始化。

document.createEvent()
event.initEvent()
element.dispatchEvent()
举个例子:var dom = document.querySelector('#id')
document.addEventListener('alert', function (event) {console.log(event)
}, false);// 创建
var evt = document.createEvent("HTMLEvents");
// 初始化
evt.initEvent("alert", false, false);// 触发, 即弹出文字
dom.dispatchEvent(evt);

1、createEvent()

createEvent()方法返回新创建的Event对象,支持一个参数,表示事件类型,具体见下表:

2、initEvent()

initEvent()方法用于初始化通过DocumentEvent接口创建的Event的值。

支持三个参数:initEvent(eventName, canBubble, preventDefault)
分别表示:

  • 事件名称
  • 是否可以冒泡
  • 是否阻止事件的默认操作

3、dispatchEvent()

dispatchEvent()就是触发执行了,dom.dispatchEvent(eventObject)
参数eventObject表示事件对象,是createEvent()方法返回的创建的Event对象。

二、自定义事件

1、Event

自定义事件的函数有 EventCustomEventdispatchEvent

// 向 window派发一个resize内置事件
window.dispatchEvent(new Event('resize'))// 直接自定义事件,使用 Event 构造函数:
var event = new Event('build');
var elem = document.querySelector('#id')
// 监听事件
elem.addEventListener('build', function (e) { ... }, false);
// 触发事件.
elem.dispatchEvent(event);

2、CustomEvent

CustomEvent 可以创建一个更高度自定义事件,还可以附带一些数据,具体用法如下:

var myEvent = new CustomEvent(eventname, options);
其中 options 可以是:
{detail: {...},bubbles: true,    //是否冒泡cancelable: false //是否取消默认事件
}

其中 detail 可以存放一些初始化的信息,可以在触发的时候调用。其他属性就是定义该事件是否具有冒泡等等功能。

内置的事件会由浏览器根据某些操作进行触发,自定义的事件就需要人工触发。
dispatchEvent 函数就是用来触发某个事件:

element.dispatchEvent(customEvent);

上面代码表示,在 element 上面触发 customEvent 这个事件。
结合起来用就是:

// add an appropriate event listener
obj.addEventListener("cat", function(e) { process(e.detail) });// create and dispatch the event
var event = new CustomEvent("cat", {"detail":{"hazcheeseburger":true}});
obj.dispatchEvent(event);
使用自定义事件需要注意兼容性问题,而使用 jQuery 就简单多了:// 绑定自定义事件
$(element).on('myCustomEvent', function(){});// 触发事件
$(element).trigger('myCustomEvent');
// 此外,你还可以在触发自定义事件时传递更多参数信息:$( "p" ).on( "myCustomEvent", function( event, myName ) {$( this ).text( myName + ", hi there!" );
});
$( "button" ).click(function () {$( "p" ).trigger( "myCustomEvent", [ "John" ] );
});

3、IE浏览器

由于向下很多版本的浏览器都不支持document.createEvent()方法,因此我们需要另辟蹊径(据说IE有document.createEventObject()和event.fireEvent()方法,但是不支持自定义事件~~)。
IE浏览器有不少自给自足的东西,例如下面要说的这个"propertychange"事件,顾名思意,就是属性改变即触发的事件。
例如文本框value值改变,或是元素id改变,或是绑定的事件改变等等。

dom.evtAlert = "2012-04-01";
<br>dom.attachEvent("onpropertychange", function(e) {if (e.propertyName == "evtAlert") {fn.call(this);}
});

这个,当我们需要触发自定义事件的时候,只要修改DOM上自定义的evtAlert属性的值即可:

dom.evtAlert = Math.random().toString(36).substr(2)

此时就会触发dom上绑定的onpropertychange事件,又因为修改的属性名正好是"evtAlert", 于是自定义的fn就会被执行。这就是IE浏览器下事件触发实现的完整机制,应该说讲得还是蛮细的。

三、自定义事件的删除

与触发事件不同,事件删除,各个浏览器都提供了对应的事件删除方法,如removeEventListenerdetachEvent。
不过呢,对于IE浏览器,还要多删除一个事件,就是为了实现触发功能额外增加的onpropertychange事件:

dom.detachEvent("onpropertychange", evt);var fireEvent = function(element,event){ if (document.createEventObject){ // IE浏览器支持fireEvent方法 var evt = document.createEventObject(); return element.fireEvent('on'+event,evt) } else{ // 其他标准浏览器使用dispatchEvent方法 var evt = document.createEvent( 'HTMLEvents' ); evt.initEvent(event, true, true); return !element.dispatchEvent(evt); }
};

自定义事件详解以及实现有趣B站直播间弹幕轰炸功能相关推荐

  1. [实践篇]13.16 vmm_service监听qvm事件原理及其自定义事件详解

    [QNX Hypervisor 2.2用户手册]目录(完结) 前面通过[实践篇]13.11扒一扒qvm与vmm之间的那点事儿,我们了解到vmm_service通过监听vmm设备节点,来接收qvm的状态 ...

  2. Spring Data JPA 从入门到精通~Auditing及其事件详解

    Auditing 及其事件详解 Auditing 翻译过来是审计和审核,Spring 的优秀之处在于帮我们想到了很多繁琐事情的解决方案,我们在实际的业务系统中,针对一张表的操作大部分是需要记录谁什么时 ...

  3. Js事件模型、事件详解

    六.Js中的事件详解 A  事件流(event  flow ) 事件模型分为两种:冒泡型事件.捕获型事件. 冒泡型(dubbed  bubbling )事件:指事件按照从最精确的对象到最不精确的对象的 ...

  4. 《PyQt5高级编程实战》自定义信号详解

    自定义信号详解 1. 创建自定义信号 2. 让自定义信号携带值 3. 自定义信号的重载版本 4. 窗口间通信 5. 线程间通信 PyQt5中各个控件自带的信号已经能够让我们完成许多需求,但是如果想要更 ...

  5. pandas dataframe中的列进行重新排序、倒排、正排、自定义排序详解及实践

    pandas dataframe中的列进行重新排序,pandas dataframe列重排.倒排.正排.自定义排序详解及实践 实施数据构建: import pandas as pd import nu ...

  6. JavaScript事件详解-jQuery的事件实现(三)

    正文 本文所涉及到的jQuery版本是3.1.1,可以在压缩包中找到event模块.该篇算是阅读笔记,jQuery代码太长.... Dean Edward的addEvent.js 相对于zepto的e ...

  7. php jquery点击事件,jQuery操作html元素点击事件详解

    这次给大家带来jQuery操作html元素点击事件详解,jQuery操作html元素点击事件的注意事项有哪些,下面就是实战案例,一起来看一下. 移除或禁用html元素的点击事件可以通过css实现也可以 ...

  8. Android Gradle 自定义Task详解二:进阶

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  9. Android Gradle 自定义Task 详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

最新文章

  1. 【java】java工具类StringUtils,org.apache.commons.lang3.StringUtils
  2. python贴吧发帖脚本-Python实现自动添加脚本头信息的示例代码
  3. RedHat7.0启动后黑屏
  4. NJUST4316(立体几何投影的面积交)
  5. py4j.protocol.Py4JJavaError: An error occurred while calling o90.save
  6. IE 7.0抛弃Win2000用户?(zz)
  7. Java Web:使用jstl标签
  8. Javascript基础知识笔记三
  9. List转Json数组
  10. 教育技术学就业方向_教育技术学专业就业方向与就业前景
  11. that was originally added here
  12. 万年历单片机C语言报告,51单片机万年历C语言
  13. Java Web学习日记(一)
  14. 三、T100应付管理之采购应付-入库应付管理篇
  15. matlab的损失函数mse,MSELoss损失函数
  16. 传记-《杰克·韦尔奇自传》书中的精髓:杰克·韦尔奇如何利用自己的智慧,推动通用电气从优秀走向卓越的?
  17. Hive案例-学生成绩表综合案例
  18. [转]使用xrc的一点心得
  19. 2017年江苏大学885代码题(含答案)
  20. win10系统右键一直转圈

热门文章

  1. 3000 多篇文章,超 170000 人订阅
  2. 基于PostgreSQL的时序数据库TimescaleDB(下)
  3. WEB安全学习第二天:BurpSuit的使用
  4. Hive日期函数使用
  5. Vue自定义组件Props中接收数组
  6. 使用Matlab2019b实现最小均方误差算法(LMS)
  7. 面试六十家公司的深圳体验
  8. 模板资源下载类网站织梦模板(带手机端) 新手搭建
  9. JSON中的JSON.parseArray()方法
  10. Android .so 共享库(动态链接库)