可以在绝对堆叠的元素上触发点击事件吗?

时间:2016-10-21 03:19:38

标签: javascript css

我有点击事件发射。它运作良好,做我需要它做的事情。这是问题

我正在构建的小部件的性质通过position: absolute将元素堆叠在彼此之上当我点击这些堆叠元素中的一个时,只有一个事件被触发,但是id就像每个要触发的元素一样在鼠标光标下点击。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

请检查演示或在整页中运行代码段,然后单击所有div以查看结果消息。

<强>样本:

http://plnkr.co/edit/KRWvLmRhGbO200pFkOxL?p=preview

我在这里做的是:

隐藏顶部元素

获取下一个绝对元素与document.elementFromPoint的坐标,然后重复。

Stack Snippet:

&#13;
&#13;
jQuery(document).ready(function(){
    $common = $("div.common").on('click.passThrough', function (e, ee) {
      var $element = $(this).hide();
      try {
        if (!ee) $("#output").empty();
        $("<div/>").append('You have clicked on: '+$element.text()).appendTo($("#output"));
        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 {
        $element.show();
      }
    });
    
    $common.css({'backgroundColor':'rgba(0,0,0,0.2)'});
});
&#13;
#output {
  margin-bottom: 30px;
}
.common {
  position: absolute;
  height: 300px;
  width: 300px;
  padding: 3px; 
  border: 1px #000 solid;
}
.elem5 {
  top: 150px;
  left: 150px;
}
.elem4 {
  top: 180px;
  left: 180px;
}
.elem3 {
  top: 210px;
  left: 210px;
}
.elem2 {
  top: 240px;
  left: 240px;
}
.elem1 {
  top: 270px;
  left: 270px;
}
&#13;
<script data-require="jquery@3.0.0" data-semver="3.0.0" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js"></script>
<div id="output"></div>
<div class="common elem1">Top Most Element</div>
<div class="common elem2">Element 2</div>
<div class="common elem3">Element 3</div>
<div class="common elem4">Element 4</div>
<div class="common elem5">Bottom Element</div>
&#13;
&#13;
&#13;

来源:

http://jsfiddle.net/E9zTs/2/

答案 1 :(得分:0)

您可以使用customEvent属性

  • 将所有div放在父div中
  • 将一个点击处理程序添加到父div
  • 如果父框中有单击,则确定单击是否位于任何子框中
  • 如果是的话。然后将click事件发送到所有子框

    //This function changes the color of all child divs
    function changeColor(e) {
      this.style.background = "red";
    }
    
    //this function is attached to the parent div which will send that click event to all divs
    function trigger(e) {
      //create an event
      event = new CustomEvent('click');
      //if the event originates from a child div
      if (e.target.className == 'box')
      //loop through all child div
        for (var i = 0; i < all_box.length; ++i) {
        //dispatch a click event to each child div
        all_box[i].dispatchEvent(event);
      }
    }
    document.getElementById('parent').addEventListener('click', trigger)
    var all_box = document.getElementsByClassName('box');
    for (var i = 0; i < all_box.length; ++i) {
      all_box[i].addEventListener('click', changeColor)
    }
    .box {
      padding: 10px;
      display: inline-block;
      border: solid black;
    }
    #parent {
      border: solid black;
      padding: 10px;
    }
    ;
    <div id="parent">
      <div class="box" id="primary">box1</div>
      <div class="box">box2</div>
      <div class="box">box3</div>
      <div class="box">box3</div>
    </div>