学习js事件时,有三种不同的写法,
第一种
<button id="btn" onclick="aa(dianji(),1000)">点击</button>
<script> function dianji() { console.log("点击") } // 防抖 function aa(fn, delay) { let timer = null // console.log(timer) return function () { if (timer) { clearTimeout(timer) } timer = setTimeout(fn, delay) } }</script>
第二种
<button id="btn" >点击</button><script> function dianji() { console.log("点击") } // 防抖 function aa(fn, delay) { let timer = null // console.log(timer) return function () { if (timer) { clearTimeout(timer) } timer = setTimeout(fn, delay) } } let a = document.getElementById("btn") a.onclick = aa(dianji, 1000); // console.log(timer)</script>
第三种
<button id="btn" >点击</button><script> // 节流 function aa1(fn,delay){ let valid = true; return function(){ if(!valid){ return false; } valid = false; setTimeout(function(){ fn(); valid = true; },delay) } } function dianji() { console.log("点击") } // 防抖 function aa(fn, delay) { let timer = null // console.log(timer) return function () { if (timer) { clearTimeout(timer) } timer = setTimeout(fn, delay) } } let a = document.getElementById("btn") // a.onclick = aa(dianji, 1000); a.addEventListener("click",aa(dianji,1000)) // console.log(timer)</script>
我想实现一下点击事件的防抖效果,但是直接在button标签中加点击事件没有效果。
第一个问题:第一种写法哪里有问题?应该怎么改正?
第二个问题:这三种写法是不是在运行的时候有区别?区别是什么?
希望有人解答一下
推荐 Lodash 中文文档 debounce
第一种 内联事件
和第二种 事件句柄
的方式都只能绑定单一的事件
第三种,可以看下MDN
上对 addEventListener 的描述,简单总结就是
阶段
执行,是否只执行一次等等在工作原理上, 内联事件
和 事件句柄
底层都是调用的 addEventListener
进行事件注册,前两者其实就是提供了一种相对 addEventListener 稍微简洁一点的事件绑定方式
第一个问题:
参照AI和其他人的回复。
第二个问题:addEventListener
使用事件监听器(事件委托)实现。
一般来说,更推荐这种方法。
onclick="aa(dianji(),1000)"
,你的aa函数第一个参数需要的是一个函数,而你的写法带()
指运行dianji这个函数,把函数返回值传给aa,把dianji传给aa应该写成onclick="aa(dianji,1000)"
没啥区别,都是事件绑定,硬说区别,就是addEventListener较前两种可以绑定多次
第一种写法的问题:
在你的第一种写法中,onclick
属性中的函数 aa(dianji(),1000)
执行时,dianji()
函数并没有传入任何参数。而在你的 dianji
函数定义中,你并没有声明接受任何参数,所以当没有传递参数给 dianji
函数时,JavaScript 会抛出一个错误。
要改正这个问题,你可以修改 dianji
函数以接受一个参数,或者在 aa
函数中传递一个参数给 dianji
函数。下面是一个修改的例子:
<button id="btn" onclick="aa(dianji,1000)">点击</button><script> function dianji(x) { console.log("点击,参数是:" + x); } // 防抖 function aa(fn, delay) { let timer = null; return function (x) { if (timer) { clearTimeout(timer); } timer = setTimeout(function() { fn(x); }, delay); } }</script>
这三种写法的区别:
这三种写法的主要区别在于何时和如何调用 dianji
函数。
dianji
函数在 HTML 元素被加载后立即被调用,然后它的返回值(如果是一个函数)或者 undefined(如果不是一个函数)被传递给 aa
函数。然后,当用户点击按钮时,aa
函数将再次被调用,并传递按钮的点击事件作为参数。dianji
函数在 HTML 元素被加载后立即被调用,并立即绑定到元素的 onclick
事件。当用户点击按钮时,dianji
函数将被调用。这种写法与第一种写法的区别在于,aa
函数在这里被直接绑定到 onclick
事件,而不是在 onclick
事件发生时被调用。dianji
函数在用户点击按钮后被调用。这是通过使用事件监听器实现的,而不是直接在 HTML 元素上设置 onclick
属性。这种写法可以让你有更多的控制权,比如可以添加多个监听器,或者在监听器被触发时执行额外的操作。此外,使用事件监听器通常是更现代和更推荐的 HTML DOM 事件处理方式。希望这个答案对你有所帮助!如果你还有其他问题,欢迎随时提问。
本文向大家介绍JavaScript事件处理的方式(三种),包括了JavaScript事件处理的方式(三种)的使用技巧和注意事项,需要的朋友参考一下 最近这段时间因为每天要修改网站,为网站做特效,所以看了很多的js接触事件,自己只会使用一小部分,有时用的时候也比较混乱,现在系统的整理了一下,特此分享到呐喊教程平台供大家参考下! 一、什么是JavaScript事件? 事件(Event)是JavaScr
本文向大家介绍DOM0、DOM2、DOM3事件处理方式的区别是什么?相关面试题,主要包含被问及DOM0、DOM2、DOM3事件处理方式的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 参考文章 参考文章
我试图实现事件处理函数,以避免每次组件和时创建新函数。 场景1: 如果我像下面那样在构造函数中绑定函数,并且在中没有参数,那么它只会在bundle文件中创建一个新函数一次 场景2: 但是,当我想将以及传递给函数时,我相信每当组件和 所以 如何更好地编写场景2,使新函数在bundle文件中只创建一次,而不是每次组件渲染和重新渲染时都创建一次?可能吗? 编辑: param1和param2是我自己的自定
本文向大家介绍javascript表单事件处理方法详解,包括了javascript表单事件处理方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了javascript处理表单事件的常用方法,供大家参考,具体内容如下 1、访问表单对象的常用方法: ①:根据<form>元素的id属性; var myform=document.getElementById("myformid");
主要内容:事件绑定,JS 事件示例JS 事件(event)是当用户与网页进行交互时发生的事情,例如单机某个链接或按钮、在文本框中输入文本、按下键盘上的某个按键、移动鼠标等等。当事件发生时,您可以使用 JavaScript 中的事件处理程序(也可称为事件监听器)来检测并执行某些特定的程序。 一般情况下事件的名称都是以单词 开头的,例如点击事件 onclick、页面加载事件 onload 等。下表中列举了一些 JavaScript 中
然而许多事件处理逻辑会更为复杂,所以直接把 JavaScript 代码写在v-on指令中是不可行的。因此v-on还可以接收一个需要调用的方法名称。 示例: <div id="example-2"> <!-- `greet` 是在下面定义的方法名 --> <button v-on:click="greet">Greet</button> </div> var example2 = ne