addEventListener有一个箭头函数回调函数,这个函数本身不能传参(当然event除外),如果你要传参,只能在doSth函数上传,我们也可以将箭头函数回调函数替换成一个函数,但是这个函数明显不能有参数
onMounted(() => {
window.addEventListener("click", doSth)//这个doSth就没有参数了
非要让doSth有参数,可以在函数外面包上一层函数
let doSth1=()=>{
doSth(param)
onMounted(() => {
window.addEventListener("click", doSth1)//这个doSth1就是外面包装的函数
以上的原理都适用于removeEventListener,但是emoveEventListener还有一个注意点,见下
onMounted(() => {
window.addEventListener("click", () => {
doSth()
onUnmounted(() => {
window.removeEventListener("click", () => {
doSth()
以上这样的代码是通不过的,因为removeEventListener的第二个参数,也就是那个回调函数必须和addEventListener的回调函数是同一个函数,共享内存,下面这种写法就行得通
onMounted(() => {
window.addEventListener("click", doSth)
onUnmounted(() => {
window.removeEventListener("click",doSth)
然而,上面这种写法还是不能传参,所以要传参的话还是要外包一个函数,如下
let doSth = (str: string) => {
console.log(str);
let doSth1 = () => {
doSth("haha")
onMounted(() => {
window.addEventListener("click", doSth1)
onUnmounted(() => {
window.removeEventListener("click", doSth1)
然而,如果你用ts的话,doSth函数的参数可以是一个可选参数,如下
let doSth = (str?: string) => {
if (typeof str == "string") {
console.log("传参了");
} else {
console.log("没传参");
onMounted(() => {
window.addEventListener("click", doSth)
onUnmounted(() => {
window.removeEventListener("click", doSth)
这样的情况则会提示一则消息:
没有与此调用匹配的重载。
第 1 个重载(共 2 个),“(type: "click", listener: (this: Window, ev: MouseEvent) => any, options?: boolean | AddEventListenerOptions | undefined): void”,出现以下错误。
第 2 个重载(共 2 个),“(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined): void”,出现以下错误。
当然这样实际运行是可以的,没什么问题,但是报错很难看,解决这个问题又不想在外面包上一层函数,那么可以直接给doSth加上any类型
let doSth: any = (str: string) => {
if (typeof str == "string") {
console.log("传参了");
} else {
console.log("没传参");
onMounted(() => {
window.addEventListener("click", doSth)
onUnmounted(() => {
window.removeEventListener("click", doSth)
当然其中原因还是没能搞懂,唉,慢慢来吧
1. 原因
许多入前端不久的人都会遇到 removeEventListener 无法清除监听的情况,这是由于
要移除事件句柄,addEventListener() 的执行函数必须使用外部函数,如上实例所示 (myFunction)。
匿名函数,类似 “document.removeEventListener(“event”, function(){ myScript });” 该事件是无法移除的。
而在很多情况下我们需要句柄回调的传参,又需要其他传参时免不了使用句柄,这个时候我们需要写一个方法去替代这个回调,以下是解决方式,写了一个addListener 函数在 addEventListene
1.监听事件addEventListener() 语法2.取消事件removeEventListener() 语法参数说明type: 表示监听事件类型的字符串。listener: 目标事件绑定的回调函数options: 一个指定有关 listener 属性的可选参数对象useCapture: 指定需要移除的 EventListener 函数是否为捕获监听器。true 表示“事件捕获”, 默认为false, 表示“事件冒泡”3. removeEventListener() 移除成功需要满足。
可能你也碰到过这种情况,就是在js的代码中用了[removed]后,可能会影响到body中的onload事件。你可以全写在body中,也可以全放到[removed]中,但是这样并不是很方便,有时我们需要两个同时用到。这时就要用window.attachEvent和window.addEventListener来解决一下。 下面是一个解决方法。至于attachEvent和addEventListener的用法,可以自己Google或百度一下。 代码如下: if (document.all){ window.attachEvent(‘onload’,函数名)//IE中 } els
vue项目中的小坑记录下,想要移除window的addEventListener,需要把后面的function挂在到this上,removeEventListener 和 addEventListener 中对应的参数要一致。
beforeDestroy() { //在组件生命周期结束的时候销毁。
window.removeEventListener('scroll',...
描述:addEventListener()方法用于向指定元素添加事件
语法:元素节点.addEventListener('type',ListenFunc,useCapture);
(1)第一个参数表示绑定事件的类型,【没有on!是个字符串】
(2)第二个参数表示监听函数,就是事件发生的时候执行的哪个函数(使用函数名,来引用外部函数)
(3)第三个参数是否采用捕获机制,默认不写和false都代表冒泡机...
上面我们在自定义指令的时候在mounted中对dom添加事件监听,在beforeUnmount中进行事件解绑,但是第二个参数是匿名函数,所以add和remove的函数不是同一个所以参数不一致,remove是无效的。一般在组件中使用addeventlistener添加事件监听的时候,在组件销毁的时候都要使用removeEventListener进行销毁,不然会造成内存泄漏。上面这样写确实可以消除掉绑定的事件,但是无法进行参数的传递无法再函数中使用el,biinding等参数。
捕获型事件流:
事件的传播是从最不特定的事件目标到最特定的事件目标。即从DOM树的根到叶子。
DOM标准采用捕获+冒泡。两种事件流都会触发DOM的所有对象,从document对象开始,也在document对象结束。
来个例子看一下吧!
<!DOCTYPE h...