Подтвердить что ты не робот

Onclick не стреляет, если элемент повторно вставлен в DOM в середине щелчка

Я создал простой менеджер всплывающих окон, который использовал dom, чтобы решить, какое всплывающее окно должно быть впереди, без какого-либо правила z-index: когда я нажимаю на всплывающее окно, оно перемещается в первую позицию, поэтому оно находится поверх другое всплывающее окно. К сожалению: это движение dom нарушает событие onclick в моем всплывающем окне.

Я сделал простой случай: следующий код должен выводить три события click: mousedown, mouseup и click, он работает в Firefox, и я думаю, что он работал в предыдущих версиях Chrome, но он не " t.

<div>
  <div onmousedown="console.log('mousedown');this.parentElement.appendChild(this);" onmouseup="console.log('mouseup');" onclick="console.log('click');">Click</div>
</div>
4b9b3361

Ответ 1

Если повторное вложение элемента в DOM останавливает событие click от запуска, тогда другим вариантом будет перемещение своих братьев и сестер.

Кажется, что это работает (я рекомендую просмотр в полноэкранном режиме, потому что вывод на консоль прерывает события, если он закрывает выделенный вами div):

function moveToFront(el) {
  var parent = el.parentElement;

  while (el.nextSibling) { 
    parent.insertBefore(el.nextSibling, el); 
  }
}

[].slice.call(document.getElementsByClassName('moveable')).forEach(function(el) {
  el.addEventListener('mousedown', function() {
    console.log('mousedown', this.id);
    moveToFront(this);
  });
  el.addEventListener('mouseup', function() {
    console.log('mouseup', this.id);
  });
  el.addEventListener('click', function() {
    console.log('click', this.id);
  });
});
.moveable {
  width: 100px;
  height: 100px;
  position: absolute;
}

#div1 {
  background-color: green;
  top: 10px;
  left: 10px;
}

#div2 {
  background-color: red;
  top: 40px;
  left: 40px;
}

#div3 {
  background-color: yellow;
  top: 20px;
  left: 70px;
}
<div>
  <div id="div1" class="moveable">Click</div>
  <div id="div2" class="moveable">Click</div>
  <div id="div3" class="moveable">Click</div>
</div>

Ответ 2

Не то, что событие прекращает стрельбу, просто вы больше не щелкаете div с событием.

Будьте осторожны с zIndexing, поскольку zIndex относится к этому контейнеру. У вас не может быть контейнер с меньшим количеством zIndex, чем его родительский или вы будете перемещать его за ним. "Грязное" решение состоит в том, чтобы zIndex расти с каждым щелчком мыши:

<style type="text/css">
html, body{
    width: 100%;
    height: 100%;
}

.Movable{
    height: 100px;
    position: absolute;
    width: 100px;
}

.black{
    background-color: black;
}

.gray{
    background-color: gray;
}

.wheat{
    background-color: lightgray;
}

<div style="position: relative; z-index: 20;">
    <p id="log" style="height: 1em; overflow-y: scroll;"></p>
    <div onclick="log( 'clicked', this )" onmousedown="log( 'mousedown', this )" onmouseup="log( 'mouseup', this )" class="Movable black"></div>
    <div onclick="log( 'clicked', this )" onmousedown="log( 'mousedown', this )" onmouseup="log( 'mouseup', this )" style="left: 25px; top: 55px;" class="Movable gray"></div>
    <div onclick="log( 'clicked', this )" onmousedown="log( 'mousedown', this )" onmouseup="log( 'mouseup', this )" style="left: 55px; top: 75px;" class="Movable wheat"></div>
</div>
<script type="text/javascript">
    var index = 1;
    function log( msg, element )
    {
        element.style.zIndex = index++;
        document.getElementById( 'log' ).innerHTML += "Log: " + msg + " -> " + element.className + "</br>";
    }
</script>