Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
前端開發(fā)中,有時(shí)我們需要模擬點(diǎn)擊頁面上的某個(gè)位置,比如自動(dòng)化測試或者模擬用戶操作。今天,我將一步步帶大家實(shí)現(xiàn)這個(gè)功能,讓大家能夠輕松理解并應(yīng)用。
簡單來說,x 和 y 坐標(biāo)就是頁面上的一個(gè)點(diǎn)的位置。x 代表水平方向,y 代表垂直方向。我們通過這兩個(gè)數(shù)值可以準(zhǔn)確地定位到頁面上的某個(gè)點(diǎn),然后在這個(gè)點(diǎn)上模擬一次點(diǎn)擊,就像用戶用鼠標(biāo)點(diǎn)擊一樣。
我們可以通過 document.elementFromPoint 方法來實(shí)現(xiàn)。這個(gè)方法會(huì)返回指定坐標(biāo)上的元素,然后我們對這個(gè)元素調(diào)用 click 方法,就能模擬一次點(diǎn)擊。
基本實(shí)現(xiàn)步驟
假設(shè)我們有以下 HTML 結(jié)構(gòu):
<div>
hello world
</div>
我們希望點(diǎn)擊這個(gè) div 元素,首先可以寫以下代碼:
// 監(jiān)聽所有點(diǎn)擊事件,并在控制臺(tái)打印被點(diǎn)擊的元素
document.addEventListener('click', (e) => {
console.log(e.target);
});
// 定義我們要點(diǎn)擊的坐標(biāo)
const x = 10;
const y = 10;
// 獲取指定坐標(biāo)上的元素,并觸發(fā)點(diǎn)擊事件
document.elementFromPoint(x, y).click();
詳細(xì)解釋:
除了直接調(diào)用 click 方法,我們還可以使用 MouseEvent 構(gòu)造函數(shù)來模擬更復(fù)雜的點(diǎn)擊事件,比如包括點(diǎn)擊的位置、是否可以取消等屬性。
// 監(jiān)聽所有點(diǎn)擊事件,并在控制臺(tái)打印被點(diǎn)擊的元素
document.addEventListener('click', (e) => {
console.log(e.target);
});
// 定義坐標(biāo)
const x = 10;
const y = 10;
// 創(chuàng)建一個(gè)點(diǎn)擊事件
const click = (x, y) => {
const ev = new MouseEvent('click', {
'view': window,
'bubbles': true,
'cancelable': true,
'screenX': x,
'screenY': y
});
// 獲取指定坐標(biāo)上的元素
const el = document.elementFromPoint(x, y);
// 分發(fā)點(diǎn)擊事件
el.dispatchEvent(ev);
};
// 調(diào)用點(diǎn)擊函數(shù)
click(x, y);
詳細(xì)解釋:
通過本文的講解,我們了解了如何在 JavaScript 中通過 x, y 坐標(biāo)來模擬點(diǎn)擊事件。無論是直接調(diào)用 click 方法,還是使用 MouseEvent 構(gòu)造函數(shù),都能實(shí)現(xiàn)這一功能。希望大家在日常開發(fā)中能用到這個(gè)技巧,提升工作效率。
如果你覺得本文有幫助,不妨點(diǎn)贊收藏,也可以分享給更多需要的小伙伴。
元素是CSS中的一種特殊選擇器, 用于在元素的特定位置插入內(nèi)容, 它們被稱為“偽元素”, 是因?yàn)樗鼈儾皇菍?shí)際存在于HTML DOM文檔中的元素, 而是通過CSS來創(chuàng)建的, 那偽元素如何添加點(diǎn)擊元素?
在頁面上我們無法通過jQuery獲取到元素中的偽元素進(jìn)行事件綁定,所以我們利用pointer-events屬性屏蔽元素操作事件, 將事件綁定到偽元素上。例:
html:
<div>盒子的內(nèi)容</div>
css:
div{
pointer-events: none;
}
div:after{
pointer-events:auto;
}
js:
$('div').on('click', function () {
console.log(this) //該事件實(shí)際綁定元素是after偽元素
})
解決偽元素蓋住點(diǎn)擊事件
在偽元素代碼中加上這句,可穿透偽元素點(diǎn)擊
pointer-events:none;
偽元素的點(diǎn)擊事件
1.父元素 使用 "pointer-events: none;" 偽元素使用"pointer-events: auto;"
<div class="subcategories">這里有點(diǎn)擊事件</div>
<div class="subcategories">這里有點(diǎn)擊事件</div>
<div class="subcategories">這里有點(diǎn)擊事件</div>
<script type="text/javascript">
//阻止點(diǎn)擊事件
$(function() {
$(".subcategories").click(function(event) {
event.stopPropagation();
});
});
</script>
么是JS事件冒泡?
在一個(gè)對象上觸發(fā)某類事件(比如單擊onclick事件), 如果此對象定義了此事件的處理程序, 那么此事件就會(huì)調(diào)用這個(gè)處理程序, 如果沒有定義此事件處理程序或者事件返回true,
那么這個(gè)事件會(huì)向這個(gè)對象的父級對象傳播, 從里到外, 直至它被處理(父級對象所有同類事件都將被激活), 或者它到達(dá)了對象層次的最頂層, 即document對象(有些瀏覽器是window)。
如何來阻止Jquery事件冒泡?
通過一個(gè)小例子來解釋
<!DOCTYPE html>
<html>
<head runat="server">
<title>Porschev---Jquery 事件冒泡</title>
<script src="jquery-1.3.2-vsdoc.js" type="text/javascript"></script>
</head>
<body>
<form id="form1" runat="server">
<div id="divOne" onclick="alert('我是最外層');">
<div id="divTwo" onclick="alert('我是中間層!')">
<a id="hr_three" href="http://www.baidu.com" mce_href="http://www.baidu.com"onclick="alert('我是最里層!')">點(diǎn)擊我</a>
</div>
</div>
</form>
</body>
</html>
比如上面這個(gè)頁面,
分為三層:divOne是第外層,divTwo中間層,hr_three是最里層;
他們都有各自的click事件,最里層a標(biāo)簽還有href屬性。
運(yùn)行頁面,點(diǎn)擊“點(diǎn)擊我”,會(huì)依次彈出:我是最里層---->我是中間層---->我是最外層
---->然后再鏈接到百度.
這就是事件冒泡, 本來我只點(diǎn)擊ID為hr_three的標(biāo)簽, 但是確執(zhí)行了三個(gè)alert操作。
事件冒泡過程(以標(biāo)簽ID表示):hr_three----> divTwo----> divOne 。從最里層冒泡到最外層。
如何來阻止?
1.event.stopPropagation();
<script type="text/javascript">
$(function() {
$("#hr_three").click(function(event) {
event.stopPropagation();
});
});
<script>
再點(diǎn)擊"點(diǎn)擊我", 會(huì)彈出:我是最里層, 然后鏈接到百度
2.return false;
如果頭部加入的是以下代碼
<script type="text/javascript">
$(function() {
$("#hr_three").click(function(event) {
return false;
});
});
<script>
再點(diǎn)擊"點(diǎn)擊我", 會(huì)彈出:我是最里層, 但不會(huì)執(zhí)行鏈接到百度頁面
由此可以看出:
1.event.stopPropagation();
事件處理過程中,阻止了事件冒泡,但不會(huì)阻擊默認(rèn)行為(它就執(zhí)行了超鏈接的跳轉(zhuǎn))
2.return false;
事件處理過程中,阻止了事件冒泡,也阻止了默認(rèn)行為(比如剛才它就沒有執(zhí)行超鏈接的跳轉(zhuǎn))
還有一種有冒泡有關(guān)的:
3.event.preventDefault();
如果把它放在頭部A標(biāo)簽的click事件中, 點(diǎn)擊"點(diǎn)擊我"。
會(huì)發(fā)現(xiàn)它依次彈出:我是最里層---->我是中間層---->我是最外層, 但最后卻沒有跳轉(zhuǎn)到百度
它的作用是:事件處理過程中, 不阻擊事件冒泡, 但阻擊默認(rèn)行為(它只執(zhí)行所有彈框, 卻沒有執(zhí)行超鏈接跳轉(zhuǎn))
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。