摘要:原生事件綁定所謂的移除事件處理函數(shù)指的是對(duì)于給定的元素和事件類型,處理程序在第一次觸發(fā)事件后會(huì)被立即解除綁定。如果為表示事件執(zhí)行之后會(huì)自動(dòng)移除綁定。標(biāo)準(zhǔn)事件事件綁定提供了一個(gè)方法實(shí)現(xiàn)只綁定一次的事件。已同步到個(gè)人博客只執(zhí)行一次的事件綁定函數(shù)
概覽
在前端開發(fā)中,有時(shí)會(huì)希望事件只被調(diào)用一次。比如,點(diǎn)擊一張縮略圖加載視頻文件或點(diǎn)擊“更多”圖標(biāo)通過(guò)AJAX展示額外的內(nèi)容。
當(dāng)多次點(diǎn)擊的時(shí)候,事件處理函數(shù)會(huì)被調(diào)用多次,這會(huì)造成瀏覽器多次加載不必要的資源。更壞的情況可能會(huì)導(dǎo)致無(wú)法預(yù)期的事情發(fā)生。
慶幸的是,使用JavaScript可以很容易的實(shí)現(xiàn)只綁定一次的事件。步驟如下:
定義事件處理函數(shù),比如點(diǎn)擊事件處理函數(shù)
點(diǎn)擊元素執(zhí)行事件處理函數(shù)
移除事件處理函數(shù)。
原生JavaScript事件綁定所謂的移除事件處理函數(shù)指的是對(duì)于給定的元素和事件類型,處理程序在第一次觸發(fā)事件后會(huì)被立即解除綁定。直接上代碼:
function once(type, selector, callback) { selector.addEventListener(type, function fn(e) { e.target.removeEventListener(e.type, fn); return callback(e); }, false); }
現(xiàn)在就可以使用once()方法只讓事件執(zhí)行一次了:
once("click", buttonElement, function () { console.log("executed only once."); });
除此之外,W3C標(biāo)準(zhǔn)提供一個(gè)事件綁定方法addEventListener,我們先來(lái)看看這個(gè)方法的API:
target.addEventListener(type, listener[, options])
其中,options對(duì)象提供一個(gè)once屬性來(lái)指定事件綁定的次數(shù),bool值。如果為true表示事件執(zhí)行之后會(huì)自動(dòng)移除綁定。
var buttonEl = document.getElementById("w3c"); buttonEl.addEventListener("click", function (e) { console.log("W3C標(biāo)準(zhǔn)事件"); },{once: true});Jquery事件綁定
jQuery提供了一個(gè)one()方法實(shí)現(xiàn)只綁定一次的事件。更多使用方法請(qǐng)參考o(jì)ne()方法文檔。
$("#foo").one("click", function() { console.log("Event fired once!!!"); });
one()其實(shí)是調(diào)用了on()方法,通過(guò)參數(shù)控制事件綁定的次數(shù)。所以如果想要了解jQuery如何實(shí)現(xiàn)事件綁定,請(qǐng)看on()方法的實(shí)現(xiàn)。
one: function (types, selector, data, fn) { return on(this, types, selector, data, fn, 1); }Vue事件綁定
Vue中的通過(guò)修飾符once實(shí)現(xiàn)只觸發(fā)一次事件處理程序的方式:
完。
已同步到個(gè)人博客只執(zhí)行一次的事件綁定函數(shù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95061.html
摘要:因此事件觸發(fā)時(shí),事件處理函數(shù)的實(shí)參中必須包含當(dāng)前事件的基本信息。事件取消事件取消中需要做的就是已經(jīng)綁定的事件處理函數(shù)移除掉即可。 事件機(jī)制為我們的web開發(fā)提供了極大的方便,使得我們能在任意時(shí)候指定在什么操作時(shí)做什么操作、執(zhí)行什么樣的代碼。 如點(diǎn)擊事件,用戶點(diǎn)擊時(shí)觸發(fā);keydown、keyup事件,鍵盤按下、鍵盤彈起時(shí)觸發(fā);還有上傳控件中,文件加入前事件,上傳完成后事件。 由于在恰當(dāng)...
摘要:執(zhí)行出來(lái)的結(jié)果是這樣的實(shí)驗(yàn)發(fā)現(xiàn),無(wú)論如何都在最后執(zhí)行,這證實(shí)了我們之前遇到的問(wèn)題,因?yàn)樵谘h(huán)結(jié)束才執(zhí)行,所以回調(diào)函數(shù)調(diào)用的取值必然是循環(huán)的最后一次。 前言 https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Closures MDN上描述閉包的章節(jié)闡述了一個(gè)由于閉包產(chǎn)生的常見錯(cuò)誤,代碼片段是這樣的 for (var i...
摘要:可以傳遞三個(gè)參數(shù)表示一個(gè)或多個(gè)事件類型,比如。表示綁定到指定元素的處理函數(shù)。我們稱它為簡(jiǎn)寫事件。必須在中,并且使用作為事件觸發(fā)元素,不然無(wú)效。和表示鼠標(biāo)移入和移出的時(shí)候觸發(fā)。按下返回按下返回和分別表示光標(biāo)激活和丟失,事件觸發(fā)時(shí)機(jī)是當(dāng)前元素。 轉(zhuǎn)自個(gè)人博客 在JavaScript 有一個(gè)非常重要的功能,就是事件驅(qū)動(dòng)。如果你的網(wǎng)頁(yè)需要與用戶進(jìn)行交互的話,就不可能不用到事件。它在頁(yè)面完全加...
摘要:運(yùn)用防抖和節(jié)流可以有效降低代碼的執(zhí)行頻率,從而解決高頻率事件的頁(yè)面卡頓問(wèn)題。在階段布局,最終確定顯示的位置和大小。在函數(shù)中,首先定義了一個(gè)空的定時(shí)器變量,用來(lái)計(jì)算時(shí)間間隔。還有一點(diǎn)要注意,在中一定要清楚定時(shí)器,不然會(huì)影響的條件判斷。 啥是節(jié)流? 節(jié)流是保證在一段時(shí)間內(nèi),代碼只執(zhí)行了一次。這個(gè)一段時(shí)間內(nèi)指的是不管用戶操作了幾次,最終僅執(zhí)行一次。比如說(shuō)一個(gè)按鈕,用戶狂點(diǎn)按鈕,但是如果用節(jié)流...
摘要:運(yùn)用防抖和節(jié)流可以有效降低代碼的執(zhí)行頻率,從而解決高頻率事件的頁(yè)面卡頓問(wèn)題。在階段布局,最終確定顯示的位置和大小。在函數(shù)中,首先定義了一個(gè)空的定時(shí)器變量,用來(lái)計(jì)算時(shí)間間隔。還有一點(diǎn)要注意,在中一定要清楚定時(shí)器,不然會(huì)影響的條件判斷。 啥是節(jié)流? 節(jié)流是保證在一段時(shí)間內(nèi),代碼只執(zhí)行了一次。這個(gè)一段時(shí)間內(nèi)指的是不管用戶操作了幾次,最終僅執(zhí)行一次。比如說(shuō)一個(gè)按鈕,用戶狂點(diǎn)按鈕,但是如果用節(jié)流...
閱讀 5099·2021-11-25 09:43
閱讀 1701·2021-10-27 14:18
閱讀 1066·2021-09-22 16:03
閱讀 1363·2019-08-30 13:19
閱讀 1584·2019-08-30 11:15
閱讀 1658·2019-08-26 14:04
閱讀 3135·2019-08-23 18:40
閱讀 1175·2019-08-23 18:17