js如何監(jiān)聽input輸入事件及使用防抖封裝函數(shù)處理方法
js監(jiān)聽input輸入事件及使用防抖封裝函數(shù)處理的實(shí)現(xiàn)
循序漸進(jìn):
1.實(shí)現(xiàn)input框的輸入監(jiān)聽事件:
<input id="search" /> //需要監(jiān)聽的dom //js實(shí)現(xiàn)(介紹兩種方式) //方式一:利用input的oninput輸入事件實(shí)現(xiàn)輸入監(jiān)聽 let inputChange1 = document.getElementById("search")//獲取inputDom inputChange1.oninput = function(){//監(jiān)聽輸入事件 console.log("監(jiān)聽到input輸入")//輸出 let value1 = this.value//拿到輸入的值 let value2 = document.getElementById("search").value//獲取值的方式二 console.log(value1,value2)//輸出 } //方式二:利用input的oninput輸入事件實(shí)現(xiàn)輸入監(jiān)聽 let inputChange2 = document.getElementById("search")//獲取inputDom inputChange2.addEventListener("onpropertychange",function(){ console.log("監(jiān)聽到input輸入")//輸出 let value1 = this.value//拿到輸入的值 let value2 = document.getElementById("search").value//獲取值的方式二 console.log(value1,value2)//輸出 }) //jquery實(shí)現(xiàn)(介紹一種) $("#search").bind("input propertychange",function(){ console.log("監(jiān)聽到input輸入") let value = $("#search").val()//拿到輸入的值 console.log(value)//輸出 })
2.防抖函數(shù)
防抖函數(shù)的目的:為了限制函數(shù)的執(zhí)行頻率而出現(xiàn),優(yōu)化解決函數(shù)觸發(fā)頻率過高導(dǎo)致延遲及假死卡頓等bug的出現(xiàn)。大多用在查詢和提交功能上。
設(shè)置時(shí)間內(nèi)多次點(diǎn)擊或者輸入只會執(zhí)行最后一次點(diǎn)擊或者輸入;
代碼:
/** * 防抖函數(shù)的封裝 * @param func 需要防抖處理的函數(shù) * @param wait 等待時(shí)間 默認(rèn)賦值了1秒 * @immediate 第一次是否需要立即執(zhí)行 boolean值 默認(rèn)為 false * **/ function debounce(func, wait = 1000, immediate = false) { // 定義一個(gè)變量來記錄上一次的定時(shí)器函數(shù)的狀態(tài) let timer = null let isImmediate = false//通過改變量控制函數(shù)是否立即執(zhí)行 //返回一個(gè)函數(shù) return function () { let _this = this//獲取input的this let args = arguments //接收函數(shù)參數(shù) // 返回的變量,讓函數(shù)只執(zhí)行最后一次 if (timer) { clearInterval(timer) //刪除上一次定時(shí)器 } if (immediate && !isImmediate) {//第一次是否需要立即執(zhí)行 當(dāng)immediate和isImmediate 都為一個(gè)值時(shí)回立即執(zhí)行 func.apply(_this, args) isImmediate = true//使函數(shù)下次不會立即執(zhí)行使其延遲 } else { timer = setTimeout(function () {//將定時(shí)器聲明為變量timer func.apply(_this, args)//如果處理函數(shù)需要用到input的this就通過這個(gè)apply從新綁定this,不綁定的話treeSearch函數(shù)this指向的是window(直接使用下面的func()就行), // func()//外部傳入的函數(shù) isImmediate = true//使函數(shù)下次不會立即執(zhí)行使其延遲 }, wait)//延遲執(zhí)行時(shí)間 } } }
3.input輸入事件和節(jié)流的結(jié)合(點(diǎn)擊事件也是如此)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <input id="search" /> </body> <script> let search = document.getElementById("search")//獲取inputDom // 需要防抖處理的函數(shù) const treeSearch = function () { // 邏輯處理 console.log("通過綁定inputThis得到的value:", this.value);//通過綁定this可以更加方便的使用當(dāng)前監(jiān)聽的input的屬性 let searchValue = document.getElementById("search").value//不重新綁定this就得重新通過獲取監(jiān)聽dom的方式拿到需要的屬性 // console.log(searchValue);//不重新綁定this獲取監(jiān)聽dom的方式拿到需要的屬性方式 } //oninput監(jiān)聽input框的輸入事件 search.oninput = debounce(treeSearch, 2000, true) /** * 防抖函數(shù)的封裝 * @param func 需要防抖處理的函數(shù) * @param wait 等待時(shí)間 默認(rèn)賦值了1秒 * @immediate 第一次是否需要立即執(zhí)行 boolean值 默認(rèn)為 false * **/ function debounce(func, wait = 1000, immediate = false) { // 定義一個(gè)變量來記錄上一次的定時(shí)器函數(shù)的狀態(tài) let timer = null let isImmediate = false//通過改變量控制函數(shù)是否立即執(zhí)行 //返回一個(gè)函數(shù) return function () { let _this = this//獲取input的this let args = arguments //接收函數(shù)參數(shù) // 返回的變量,讓函數(shù)只執(zhí)行最后一次 if (timer) { clearInterval(timer) //刪除上一次定時(shí)器 } if (immediate && !isImmediate) {//第一次是否需要立即執(zhí)行 當(dāng)immediate和isImmediate 都為一個(gè)值時(shí)回立即執(zhí)行 func.apply(_this, args) isImmediate = true//使函數(shù)下次不會立即執(zhí)行使其延遲 } else { timer = setTimeout(function () {//將定時(shí)器聲明為變量timer func.apply(_this, args)//如果處理函數(shù)需要用到input的this就通過這個(gè)apply從新綁定this,不綁定的話treeSearch函數(shù)this指向的是window(直接使用下面的func()就行), // func()//外部傳入的函數(shù) isImmediate = true//使函數(shù)下次不會立即執(zhí)行使其延遲 }, wait)//延遲執(zhí)行時(shí)間 } } } </script> </html>
效果圖:
直接復(fù)制最下面的代碼塊就能看到效果了,如有錯(cuò)誤望大佬能夠指正。
總結(jié)
到此這篇關(guān)于js如何監(jiān)聽input輸入事件及使用防抖封裝函數(shù)處理方法的文章就介紹到這了,更多相關(guān)js監(jiān)聽input輸入事件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js實(shí)現(xiàn)時(shí)間顯示幾天前、幾小時(shí)前或者幾分鐘前的方法集錦
這篇文章主要介紹了js實(shí)現(xiàn)時(shí)間顯示幾天前、幾小時(shí)前或者幾分鐘前的方法,實(shí)例匯總分析了時(shí)間顯示格式轉(zhuǎn)換的常用思路與技巧,需要的朋友可以參考下2015-05-05關(guān)于JavaScript奇怪又實(shí)用的六個(gè)姿勢
這篇文章主要給大家介紹了關(guān)于JavaScript奇怪又實(shí)用的六個(gè)姿勢,這些技巧和建議是我平常在開發(fā)項(xiàng)目上會用到的,希望能讓大家學(xué)到知識,需要的朋友可以參考下2021-10-10利用Bootstrap實(shí)現(xiàn)表格復(fù)選框checkbox全選
Bootstrap相信應(yīng)該不用多介紹,來自 Twitter,是目前最受歡迎的前端框架。這篇文章主要給大家介紹了如何利用Bootstrap實(shí)現(xiàn)表格中的checkbox復(fù)選框全選效果,文中給出詳細(xì)的介紹及完整的實(shí)例代碼,相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,下面來一起看看吧。2016-12-12JavaScrip數(shù)組去重操作實(shí)例小結(jié)
這篇文章主要介紹了JavaScrip數(shù)組去重操作,結(jié)合實(shí)例形式總結(jié)分析了javascript針對數(shù)組的遍歷、判斷、去重等相關(guān)操作技巧,需要的朋友可以參考下2019-06-06electron中preload.js文件的用法小結(jié)
preload.js文件在Electron應(yīng)用中起著橋梁的作用,使得在保持安全的同時(shí),渲染進(jìn)程可以訪問主進(jìn)程的功能,保持渲染進(jìn)程與主進(jìn)程隔離的同時(shí),又能使渲染進(jìn)程具有訪問特定Electron API的能力的方法,本文給大家分享electron中preload.js文件的用法,感興趣的朋友一起看看吧2024-04-04