我有一堆絕對互相重疊的divs。當我將一個點擊事件綁定到所有這些事件時,只有頂級div響應。我該如何將事件發送給光標下的所有div?如何傳播點擊光標下的所有div?
回答
以FelixKling的建議,使用document.elementFromPoint()
和Amberlamps的小提琴,並採用的jQuery的DOM的交互,我結束了以下內容:
$divs = $("div").on('click.passThrough', function (e, ee) {
var $el = $(this).hide();
try {
console.log($el.text());//or console.log(...) or whatever
ee = ee || {
pageX: e.pageX,
pageY: e.pageY
};
var next = document.elementFromPoint(ee.pageX, ee.pageY);
next = (next.nodeType == 3) ? next.parentNode : next //Opera
$(next).trigger('click.passThrough', ee);
} catch (err) {
console.log("click.passThrough failed: " + err.message);
} finally {
$el.show();
}
});
try/catch/finally
用於確保元素再次顯示,即使發生錯誤。
兩種機制允許通過或不被傳遞點擊事件:
- 處理程序安裝於僅選擇的元素(標準的jQuery)。
- 命名空間點擊事件,
click.passThrough
類似於event.stopPropagation()
。
單獨或組合起來,這些機制在控制「passThrough」行爲的附着和傳播方面提供了一些靈活性。例如,在DEMO中,嘗試從「b」元素中刪除類p
,並查看傳播行爲是如何改變的。
就目前而言,代碼需要進行編輯才能獲得不同的應用程序級行爲。一個更廣義的解決辦法:
- 允許的針對特定應用的行爲
- 允許「直通」傳播的編程抑制,類似於
event.stopPropagation()
方案附件。
這兩個雄心可能通過在jQuery中建立clickPassthrough
事件來實現,具有潛在的「passThrough」行爲,但是要做到這一點將涉及更多的工作。也許有人想去一趟。
在信用到期的情況下,你如何禮貌地給予信用。 :) – TheOne
當被點擊的元素是一個錨點時出現問題 –
如果其他人有和我一樣的問題:'if($(next).prop(「tagName」)==='A'){window.location .href = $(next).attr('href'); }' –
這並不像您想象的那麼容易。這是我想出的解決方案。我只在Chrome中測試過,並沒有使用任何框架。
以下片段僅用於向文檔中的每個div
添加單擊事件,該事件在觸發時輸出其類名。
var divs = document.getElementsByTagName("div");
for(var i = 0; i < divs.length; i++) {
divs[i].onclick = function() {
console.log("class clicked: " + this.className);
};
}
將點擊事件附加到body元素,以便每個單擊事件都被我們的腳本注意到。遍歷你要檢查的所有div(你可能想在這裏調整你的首選div範圍)。生成他們的計算樣式並檢查鼠標座標是否在div的位置範圍內加上其寬度和高度。當div是我們的源元素時,不要觸發點擊事件,因爲點擊事件已經被觸發了。
function countDivs(e) {
e = e || window.event;
for(var i = 0; i < divs.length; i++) {
var cStyle = window.getComputedStyle(divs[i]);
if(divs[i] !== e.target && e.pageX >= parseInt(cStyle.left) && e.pageX <= (parseInt(cStyle.left) + parseInt(cStyle.width)) && e.pageY >= parseInt(cStyle.top) && e.pageY <= (parseInt(cStyle.top) + parseInt(cStyle.height))) {
divs[i].click();
}
}
}
CSS:
.a, .b, .c {
position: absolute;
height: 100px;
width: 100px;
border: 1px #000 solid
}
.a {
top: 100px;
left: 100px;
}
.b {
top: 120px;
left: 120px;
}
.c {
top: 140px;
left: 140px;
}
HTML:
<div class="a"></div>
<div class="b"></div>
<div class="c"></div>
我還添加了jsFiddle
您的解決方案如何工作?你能否解釋它,而不是隻發佈代碼? –
@FelixKling:我添加了一些解釋。我認爲這就夠了,不是嗎? – Amberlamps
太棒了!請注意,'e.srcElement'只是IE瀏覽器(儘管Chrome增加了一些IE功能)。原始元素的官方屬性是「e.target」。 –
一個簡單的方法可以是使用elementFromPoint():
var clicks = 0,cursorPosition={};
$('div').click(function (e) {
if(typeof cursorPosition.X === 'undefined') {
cursorPosition.X = e.pageX;
cursorPosition.Y = e.pageY;
}
clicks++;
e.stopPropagation();
$(this).addClass('hided');
var underELEM = document.elementFromPoint(cursorPosition.X, cursorPosition.Y);
if (underELEM.nodeName.toUpperCase() === "DIV") $(underELEM).click();
else {
$('#clicks').html("Clicks: " + clicks);
$('.hided').removeClass('hided');
clicks=0;
cursorPosition = {};
}
});
當我點擊兩個底部div時,這給了我'Clicks:3'。 – Amberlamps
對不起,請參閱更新。 –
如果您堆疊元素絕對可能更爲簡單堆疊它們放在一個定位的容器,並處理這個父的事件。然後,您可以操作其兒童而無需測量任何東西。
- 1. Javascript +點擊所有div
- 2. 不傳播點擊
- 3. 如何使光標停止/開始點擊光標
- 4. Selenium:如何點擊所有具有相同類名的DIV
- 5. 如何獲得的所有值光標
- 6. 如何在不點擊div的情況下單擊可點擊div(ng-click)內的標籤?
- 7. 閃光AS3.0鼠標點擊
- 8. 如何在光標下的所有元素上調用mouseover?
- 9. 如何使div下降可點擊?
- 10. 如何點擊div下拉菜單
- 11. 模擬鼠標點擊/檢測Python中光標下的顏色
- 12. 如何統計頁面中所有div的點擊次數?
- 13. 如何「點擊」螢火蟲控制檯中的所有div?
- 14. Jquery展開收起所有div點擊
- 15. 如何在gridview行下顯示div標籤點擊
- 16. Mercurial中的標籤如何自動傳播到所有分支?
- 17. 在沒有移動光標的情況下執行鼠標點擊
- 18. 可點擊的div標籤
- 19. 如何傳播從不可見的div點擊到嵌入式閃存?
- 20. 可點擊下方的div透明DIV
- 21. 光標內的所有PLSQL
- 22. 如何點擊文本框中的光標點擊wpf中的RepeatButton?
- 23. 光標在鼠標點擊更改
- 24. XY座標光標點擊X11
- 25. 在iPhone上點擊下的閃光燈
- 26. 閃光燈下的圖層,點擊
- 27. 通過div點擊而不會丟失光標css
- 28. 如何放大到鼠標光標下的點(處理)
- 29. AS3 - 如何讓鼠標光標點擊按鈕?
- 30. 如何獲得畫布光標點擊座標
是否無法記錄以控制點擊的消息的錯誤? – defau1t
@ defau1t:當點擊一次時,他希望在控制檯中出現三次'clicked'。 – Amberlamps
http://jsfiddle.net/vA5WQ/23/ – TheOne