我有一堆 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();
}
});
DEMO http://jsfiddle.net/E9zTs/2/
try/catch/finally
用于确保元素再次显示,即使发生错误也是如此。
有两种机制允许点击事件传递或不传递:
- 仅将处理程序附加到选定的元素(标准 jQuery)。
- 命名点击事件,
click.passThrough
类似于event.stopPropagation()
.
这些机制单独或组合起来,在控制“直通”行为的附加和传播方面提供了一定的灵活性。例如,在DEMO中,尝试删除类p
从“b”元素中查看传播行为如何变化。
就目前而言,需要编辑代码以获得不同的应用程序级行为。更通用的解决方案是:
- 允许以编程方式附加特定于应用程序的行为
- 允许以编程方式抑制“直通”传播,类似于
event.stopPropagation()
.
这两个目标都可以通过建立一个clickPassthrough
jQuery 中的事件,具有底层的“passThrough”行为,但要实现这一点需要做更多的工作。也许有人想尝试一下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)