我有一个具有背景的div:透明,以及边框。在这个div下面,我有更多的元素。
目前,当我在覆盖div外部单击时,我可以单击底层元素。但是,当我直接单击覆盖div时,我无法单击底层元素。
我希望能够单击这个div,以便单击底层元素。
我有一个具有背景的div:透明,以及边框。在这个div下面,我有更多的元素。
目前,当我在覆盖div外部单击时,我可以单击底层元素。但是,当我直接单击覆盖div时,我无法单击底层元素。
我希望能够单击这个div,以便单击底层元素。
当前回答
我认为event.stopPropagation();这里也应提及。将此添加到按钮的单击功能。
防止事件在DOM树中冒泡,防止任何父处理程序收到事件通知。
其他回答
这不是问题的精确答案,但可能有助于找到解决方法。
我有一个图像,我在页面加载时隐藏并在等待AJAX调用时显示,然后再次隐藏。。。
我发现在加载页面时显示我的图像,然后使其消失,并能够在隐藏之前单击图像所在的位置的唯一方法是将图像放入DIV中,使DIV的大小为10x10像素或足够小,以防止其引发问题,然后隐藏包含的DIV。这允许图像在可见时溢出DIV,当DIV隐藏时,只有divs区域受到无法单击下方对象的影响,而不是DIV包含和显示的图像的整个大小。
我尝试了所有隐藏图像的方法,包括CSS display=none/block,opacity=0,hidden=true隐藏图像。所有这些都导致我的图像被隐藏,但显示的区域就像下面的东西上有一个盖子,所以点击等不会对底层对象起作用。一旦图像位于一个小DIV内,我隐藏了这个小DIV,图像所占的整个区域都是清晰的,只有我隐藏的DIV下的小区域受到影响,但当我将其缩小到足够小(10x10像素)时,问题得到了解决(某种程度上)。
我发现这是一个肮脏的解决方法,它应该是一个简单的问题,但我无法找到任何方法在没有容器的情况下以其原生格式隐藏对象。我的目标是等。如果有人有更好的方法,请告诉我。
我认为您可以考虑更改标记。如果我没有错,您希望在文档上方放置一个不可见的层,并且您的不可见标记可能位于文档图像之前(这是正确的吗?)。
相反,我建议您将不可见图像放在文档图像之后,但将位置更改为绝对位置。
请注意,您需要一个父元素来具有position:relative,然后您就可以使用这个想法了。否则,绝对层将仅放置在左上角。
绝对位置元素相对于第一个父元素定位具有非静态位置的元素。如果没有找到这样的元素,则包含块为html
希望这有帮助。有关CSS定位的更多信息,请参阅此处。
我不能总是使用指针事件:在我的场景中没有,因为我希望覆盖层和底层元素都可以单击/选择。
DOM结构如下所示:
<div id="outerElement">
<div id="canvas-wrapper">
<canvas id="overlay"></canvas>
</div>
<!-- Omitted: element(s) behind canvas that should still be selectable -->
</div>
(outerElement、canvas wrapper和canvas元素具有相同的大小。)
为了使画布后面的元素正常工作(例如,可选择、可编辑),我使用了以下代码:
canvasWrapper.style.pointerEvents = 'none';
outerElement.addEventListener('mousedown', event => {
const clickedOnElementInCanvas = yourCheck // TODO: check if the event *would* click a canvas element.
if (!clickedOnElementInCanvas) {
// if necessary, add logic to deselect your canvas elements ...
wrapper.style.pointerEvents = 'none';
return true;
}
// Check if we emitted the event ourselves (avoid endless loop)
if (event.isTrusted) {
// Manually forward element to the canvas
const mouseEvent = new MouseEvent(event.type, event);
canvas.dispatchEvent(mouseEvent);
mouseEvent.stopPropagation();
}
return true;
});
一些画布对象还带有输入字段,因此我也必须允许键盘事件。为此,我必须根据画布输入字段当前是否聚焦来更新pointerEvents属性:
onCanvasModified(canvas, () => {
const inputFieldInCanvasActive = // TODO: Check if an input field of the canvas is active.
wrapper.style.pointerEvents = inputFieldInCanvasActive ? 'auto' : 'none';
});
我目前使用的是画布演讲气球。但是,由于带有指针的气球被包装在一个div中,因此它下面的一些链接不再可单击。在这种情况下,我不能使用extjs。参见我的演讲气球教程需要HTML5的基本示例
因此,我决定从阵列中的气球内部收集所有链接坐标。
var clickarray=[];
function getcoo(thatdiv){
thatdiv.find(".link").each(function(){
var offset=$(this).offset();
clickarray.unshift([(offset.left),
(offset.top),
(offset.left+$(this).width()),
(offset.top+$(this).height()),
($(this).attr('name')),
1]);
});
}
我在每个(新的)气球上调用这个函数。它获取link.class的左/上角和右/下角的坐标-此外,如果有人在该坐标中单击,该怎么做的name属性,我喜欢设置1,这意味着它没有被单击jet。然后将此阵列取消移动到单击阵列。你也可以使用push。
要使用该阵列,请执行以下操作:
$("body").click(function(event){
event.preventDefault();//if it is a a-tag
var x=event.pageX;
var y=event.pageY;
var job="";
for(var i in clickarray){
if(x>=clickarray[i][0] && x<=clickarray[i][2] && y>=clickarray[i][1] && y<=clickarray[i][3] && clickarray[i][5]==1){
job=clickarray[i][4];
clickarray[i][5]=0;//set to allready clicked
break;
}
}
if(job.length>0){
// --do some thing with the job --
}
});
此函数用于证明主体单击事件的坐标或是否已单击该事件,并返回name属性。我认为没有必要再深入一点,但你知道这并没有那么复杂。希望在我身边。。。
我加上这个答案是因为我没有看到它的全部内容。我能够使用elementFromPoint完成这一操作。所以基本上:
将单击附加到要单击的div把它藏起来确定指针所在的元素单击元素。
var range-selector= $("")
.css("position", "absolute").addClass("range-selector")
.appendTo("")
.click(function(e) {
_range-selector.hide();
$(document.elementFromPoint(e.clientX,e.clientY)).trigger("click");
});
在我的例子中,重叠的div是绝对定位的——我不确定这是否会产生差异。这至少适用于IE8/9、Safari Chrome和Firefox。