如何检测被拖动的元素是否掉在了父体之外?

问题描述 投票:0回答:1

我想知道当一个元素被拖动并掉到其父体之外时,如何检测?

element.addEventListener('dragend', function(event) {
  // check if element is dropped outside its parent
}, false)
javascript drag-and-drop
1个回答
0
投票

该技术通过以下方式识别被拖动的元素是否被放置在其父元素内。

  1. 存储 dragParent 元素时的'拖动开始'。
  2. 侦听'滴滴'事件
  3. 使用投放事件的 event.target 以确定投放目标
  4. 从目标的DOM树上走过去搜索 dragParent

// the parent of the dragged element
let dragParent = null;

function handleDragstart(ev) {
  dragParent = ev.target.parentElement;
  dragParent.addEventListener('dragover', handleDragover);
  dragParent.addEventListener('drop', handleDrop);
}

function handleDrop(ev) {
  ev.preventDefault();
  ev.stopPropagation();
  // search up DOM tree for dragParent
  for (let el = ev.target; el.tagName !== 'HTML';
       el = el.parentElement) {
    if (el === dragParent) {
      alert('#p1 was dropped inside dragParent');
      return;
    }
  }
  alert('#p1 was dropped outside dragParent');
}

function handleDragover(ev) {
  ev.preventDefault();
}

function handleDragend(ev) {}

const p1 = document.getElementById('p1');
p1.addEventListener('dragstart', handleDragstart);
p1.addEventListener('dragend', handleDragend);

const sibling = document.getElementById('sibling');
sibling.addEventListener('dragover', handleDragover);
sibling.addEventListener('drop', handleDrop);

let stranger = document.getElementById('stranger');
stranger.addEventListener('dragover', handleDragover);
stranger.addEventListener('drop', handleDrop);

let body = document.body;
body.addEventListener('dragover', handleDragover);
body.addEventListener('drop', handleDrop);
body {
  margin: 0;
  padding: 0.4rem;
  height: 100vh;
  width: 100vw;
}

#parent {
  background-color: #ddd;
  width: 90%;
  padding: 0.3rem;
}

#p1 {
  background-color: white;
  padding: 0.1rem;
  width: 12rem;
}

#sibling {
  background-color: #bbb;
  width: 15rem;
  height: 3rem;
}

#stranger {
  background-color: #ddd;
  margin: 0.5rem 0;
  width: 90%;
  height: 80px;
  padding: 0.3rem;
}
<body>
  body
  <h3>Drop #p1 inside or outside #parent</h3>
  <div id="parent">
    #parent
    <p id="p1" draggable="true">
      #p1 (draggable)
    </p>
    <div id="sibling">
      #sibling
    </div>
  </div>
  <div id="stranger">
    #stranger
  </div>
</body>
© www.soinside.com 2019 - 2024. All rights reserved.