最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解用js代碼觸發(fā)dom事件的實(shí)現(xiàn)方案

 更新時(shí)間:2020年06月10日 10:44:06   作者:水電  
這篇文章主要介紹了詳解用js代碼觸發(fā)dom事件的實(shí)現(xiàn)方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

背景

前端編寫(xiě)測(cè)試用例時(shí),在測(cè)試界面上的一些效果時(shí),通常都希望能夠模擬一些用戶(hù)操作,而模擬用戶(hù)操作最主要的方式就是用代碼觸發(fā)指定事件。通常一些元素上會(huì)自帶一些觸發(fā)事件的方法,例如click、focus等,但是如果是其他的事件,例如mousedown、mouseup、mouseenter,這些事件怎么模擬呢?

思路

其實(shí)思路很簡(jiǎn)單,web標(biāo)準(zhǔn)中定義了一系列API接口,其中dispatchEvent允許我們向一個(gè)指定的事件目標(biāo)派發(fā)一個(gè)事件,而且使用這個(gè)方法觸發(fā)的事件是可以正常觸發(fā)我們的標(biāo)準(zhǔn)事件處理規(guī)則的(包括事件捕獲和可選的冒泡過(guò)程),那么這就非常強(qiáng)大了,我們可以基于此做很多事情了。

實(shí)現(xiàn)方法

大致流程相信大家都已經(jīng)想到了,無(wú)外乎以下幾步操作:

  • 創(chuàng)建要觸發(fā)的事件實(shí)例
  • 獲取要觸發(fā)事件的元素對(duì)象
  • 調(diào)用元素對(duì)象的dispatchEvent方法,參數(shù)是目標(biāo)事件實(shí)例
  • 特殊事件要分析一下模擬方式,巧妙的實(shí)現(xiàn)

首先,創(chuàng)建事件實(shí)例

web標(biāo)準(zhǔn)提供了MouseEvent 接口,專(zhuān)指用戶(hù)與指針設(shè)備( 如鼠標(biāo) )交互時(shí)發(fā)生的事件。使用此接口的常見(jiàn)事件包括:click、dblclick 、mouseup、mousedown。

通過(guò)構(gòu)造函數(shù)MouseEvent(typeArg, mouseEventInit),可以生成一個(gè)新的MouseEvent對(duì)象。該構(gòu)造函數(shù)接受兩個(gè)參數(shù),第一個(gè)參數(shù)為typeArg,用于指定事件的名稱(chēng),一般都是一個(gè)字符串。第二個(gè)參數(shù)為mouseEventInit,可以初始化 MouseEvent的字典,也就是指定一些該事件的屬性值,比如鼠標(biāo)事件常見(jiàn)的screenX、screenY、clientX、clientY等屬性,同時(shí),由于MouseEvent是繼承于UIEvent,UIEvent又繼承于Event,所以mouseEventInit可以包含UIEventInit和EventInit中的屬性。

總結(jié)一行代碼就是:

const mouseEvent = new MouseEvent(typeArg, mouseEventInit);

這里大家看自己實(shí)際需要,去指定哪些屬性的哪些值即可。

這里再說(shuō)一句,不僅是鼠標(biāo)事件,還有很多其他事件,只要瀏覽器支持,都可以使用的。具體參考:https://developer.mozilla.org/zh-CN/docs/Web/API

這里面列出的事件,理論上都可以自己模擬并觸發(fā)。

其次,就是在指定元素上觸發(fā)該事件

有了事件,那么就可以去調(diào)用對(duì)應(yīng)元素上的dispatchEvent方法觸發(fā)了。這里簡(jiǎn)單,也就是一行代碼:

document.getElementById("id").dispatchEvent(mouseEvent);

最后,特殊事件或者場(chǎng)景,分解操作來(lái)模擬

有些特殊事件或者場(chǎng)景,其實(shí)可以分析一波細(xì)節(jié),然后分解成若干個(gè)事件連續(xù)觸發(fā),即可巧妙的實(shí)現(xiàn)。
這里舉個(gè)例子,點(diǎn)擊事件,其實(shí)本質(zhì)是:觸發(fā)一次mousedown,同時(shí)在足夠短的時(shí)間內(nèi)再觸發(fā)一次mouseup,那么這樣即可間接實(shí)現(xiàn)一次click事件。即:

// 一段足夠短的時(shí)間內(nèi)
mousedown+mouseup=click

這樣,其實(shí)在模擬一些特殊操作時(shí),我們也可以實(shí)現(xiàn)了。比如,模擬用戶(hù)的鼠標(biāo)拖拽多選操作,其本質(zhì)就是:現(xiàn)在某個(gè)元素上觸發(fā)mousedown事件,然后執(zhí)行mousemove事件,然后拖拽到某一個(gè)元素上時(shí),觸發(fā)mouseup事件;即:

// 模擬用戶(hù)拖拽鼠標(biāo)
(開(kāi)始元素)mousedown+(截止元素)mouseup=一次鼠標(biāo)拖拽操作

這里細(xì)節(jié)可以足夠多,看你實(shí)際場(chǎng)景按需模擬即可,比如鼠標(biāo)移動(dòng)過(guò)程中,鼠標(biāo)進(jìn)入某個(gè)元素時(shí),該元素還會(huì)觸發(fā)mouseenter事件,離開(kāi)元素還會(huì)觸發(fā)mouseleave事件。那就是:

// 更精確的模擬用戶(hù)拖拽鼠標(biāo)
(開(kāi)始元素)mousedown+(中間元素)mouseenter+(中間元素)mouseleave+(截止元素)mouseup=一次鼠標(biāo)拖拽操作

總之,細(xì)節(jié)可以足夠多,但是夠你模擬出本次操作的基本測(cè)試點(diǎn)即可,別忘了,我們的前提是模擬用戶(hù)操作,進(jìn)而執(zhí)行測(cè)試用例。

再進(jìn)一步,你完全可以封裝一些常見(jiàn)的用戶(hù)操作,然后將方法暴露出來(lái),在測(cè)試用例中引入,實(shí)現(xiàn)高度復(fù)用。

總結(jié)

總結(jié)下來(lái)呢,其實(shí)就是采用MouseEvent和dispatchEvent兩個(gè)web標(biāo)準(zhǔn)提供的接口,來(lái)通過(guò)代碼觸發(fā)事件,進(jìn)而模擬用戶(hù)的操作,達(dá)到測(cè)試用例中,模擬用戶(hù)行為的目的。希望對(duì)你有所幫助。

注意事項(xiàng)

這里有些限制條件,需要大家注意下:

  1. 本文所說(shuō)的方法,主要是用于自動(dòng)化測(cè)試場(chǎng)景中的,正常開(kāi)發(fā)項(xiàng)目中,不建議大家用這種方式觸發(fā)事件,這可能會(huì)導(dǎo)致你的代碼難以理解,影響代碼的可維護(hù)性。
  2. 本文中主要用到的這兩大接口,是有兼容性限制的,IE基本上是無(wú)法使用的,但是,一般來(lái)講,使用這種方法的場(chǎng)景多數(shù)都是單元測(cè)試或者自動(dòng)化測(cè)試的場(chǎng)景,這些場(chǎng)景下一般都會(huì)有模擬瀏覽器環(huán)境,而且用的最多的就是chrome的內(nèi)核,所以基本上在測(cè)試場(chǎng)景下,這種方式是可以放心使用的。

到此這篇關(guān)于詳解用js代碼觸發(fā)dom事件的實(shí)現(xiàn)方案的文章就介紹到這了,更多相關(guān)js觸發(fā)dom事件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

永胜县| 池州市| 德阳市| 清水河县| 绥德县| 望奎县| 清徐县| 东丰县| 沧州市| 陆河县| 同江市| 莎车县| 绵阳市| 宜州市| 灵台县| 宁远县| 得荣县| 林甸县| 徐闻县| 湘乡市| 利川市| 黑山县| 固镇县| 浠水县| 灯塔市| 湖州市| 班玛县| 吉林市| 昆明市| 察哈| 东乌| 米泉市| 平顶山市| 澜沧| 特克斯县| 成安县| 裕民县| 淅川县| 宽城| 正宁县| 鄂州市|