【问题标题】:prevent drop inside a child element when drag & dropping with JS使用 JS 拖放时防止在子元素内掉落
【发布时间】:2015-03-28 00:31:31
【问题描述】:

我创建了一个简单的拖放设置,两个 div 允许用户在两​​者之间拖动一个子 div。除非将“子 div”直接放在另一个中,否则它可以正常工作。几个小时以来,我一直在努力解决这个问题,但我必须找到一个简单的解决方案。

您可以在这里看到一个(不完全)工作演示 https://preview.c9.io/teemoash/fantasyleague/gamething/pete.html?_c9_id=livepreview4&_c9_host=https%3A%2F%2Fide.c9.io

非常感谢任何帮助

谢谢!

html 非常简单。 (请注意,我尝试在 onDrop 和 onDragOver 事件上返回 false)

    <div id = "squad" ondrop="drop(event)" ondragover="allowDrop(event)">
    <h1>SQUAD</h1>
    <div id = "jeff" class = "champion" draggable = "true" ondragstart="drag(event)" ondrop = "return false" ondragover="return false">
        <h1>Jeff</h1>

        <div class = "attributes">
            <div class = "number kills"><span> 4</span><p>Kills</p></div>
            <div class = "number deaths"><span>2 </span><p>Deaths</p></div>
            <div class = "number GPM"><span> 12</span><p>GPM</p></div>

        </div>
    </div>


    <div id = "Geoff" class = "champion" draggable = "true" ondragstart="drag(event)" ondrop = "return false" ondragover="return false">
        <h1>Geoff</h1>

        <div class = "attributes">
            <div class = "number kills"><span> 7</span><p>Kills</p></div>
            <div class = "number deaths"><span>0 </span><p>Deaths</p></div>
            <div class = "number GPM"><span> 14</span><p>GPM</p></div>

        </div>
    </div>

    <div id = "jeph" class = "champion" draggable = "true" ondragstart="drag(event)" ondrop = "return false" ondragover="return false">
        <h1>Jeph</h1>

        <div class = "attributes">
            <div class = "number kills"><span> 1</span><p>Kills</p></div>
            <div class = "number deaths"><span>9 </span><p>Deaths</p></div>
            <div class = "number GPM"><span> 24</span><p>GPM</p></div>

        </div>
    </div>

</div> <!-- end of squad div-->

<div id = "myTeam" ondrop="drop(event)" ondragover="allowDrop(event)">
    <h1>My Team</h1>

</div>

<div id = "scores">
    <h1>My Team Scores</h1>
</div>

js看起来是这样的;

<script>


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

function drag(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
}

function drop(ev) {

 ev.preventDefault();
 var data = ev.dataTransfer.getData("text");
 ev.target.appendChild(document.getElementById(data));

}
</script>

【问题讨论】:

  • 当您放置在孩子身上时,您的事件目标会发生变化。您需要在 dom 树上向上爬,直到使用 drop handler 到达 div。

标签: javascript html


【解决方案1】:

问题在于 drop 与事件相关联,但您拥有它的方式应该只是与这样的元素相关联:

function drop(ev, el) {
  ev.preventDefault();
  var data = ev.dataTransfer.getData("text");
  el.appendChild(document.getElementById(data));
}

然后在您的两个ondrop 事件中将您的drop(event) 更改为drop(event, this)。看看整页模式下的 sn-p 看看它是否有效。

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

function drag(ev) {
  ev.dataTransfer.setData("text", ev.target.id);
}

function drop(ev, el) {
  ev.preventDefault();
  var data = ev.dataTransfer.getData("text");
  el.appendChild(document.getElementById(data));
}
* {
  margin: 0;
  box-sizing: border-box;
}
#squad {
  width: 40vw;
  height: 90vh;
  overflow-y: scroll;
  border-radius: 10px;
  margin-left: 5vw;
  margin-top: 5vh;
  background-color: red;
  float: left;
}
h1 {
  text-align: center;
}
#myTeam {
  float: left;
  height: 60vh;
  width: 40vw;
  border-radius: 10px;
  background-color: red;
  margin-left: 10vw;
  margin-top: 5vh;
}
#scores {
  width: 40vw;
  height: 25vh;
  margin-top: 5vh;
  margin-left: 10vw;
  background-color: red;
  border-radius: 10px;
  float: left;
}
.champion {
  width: 90%;
  height: 15vh;
  margin: 1%;
  padding: 2%;
  border: 1px black solid;
  background-color: white;
  border-radius: 10px;
  overflow: hidden;
}
.champion h1 {
  float: left;
}
.attributes {
  margin-left: 10%;
  float: left;
}
.number {
  float: left;
  text-align: center;
  margin-left: 10px;
}
#div1,
#div2 {
  width: 90%;
  height: 15vh;
  margin: 1%;
  border: 1px black solid;
  border-radius: 10px;
}
<div id="squad" ondrop="drop(event, this)" ondragover="allowDrop(event)">
  <h1>SQUAD</h1>

  <div id="jeff" class="champion" draggable="true" ondragstart="drag(event)" ondrop="return false" ondragover="return false">
    <h1>Jeff</h1>

    <div class="attributes">
      <div class="number kills"><span> 4</span>
        <p>Kills</p>
      </div>
      <div class="number deaths"><span>2 </span>
        <p>Deaths</p>
      </div>
      <div class="number GPM"><span> 12</span>
        <p>GPM</p>
      </div>
    </div>
  </div>
  <div id="Geoff" class="champion" draggable="true" ondragstart="drag(event)" ondrop="return false" ondragover="return false">
    <h1>Geoff</h1>

    <div class="attributes">
      <div class="number kills"><span> 7</span>
        <p>Kills</p>
      </div>
      <div class="number deaths"><span>0 </span>
        <p>Deaths</p>
      </div>
      <div class="number GPM"><span> 14</span>
        <p>GPM</p>
      </div>
    </div>
  </div>
  <div id="jeph" class="champion" draggable="true" ondragstart="drag(event)" ondrop="return false" ondragover="return false">
    <h1>Jeph</h1>

    <div class="attributes">
      <div class="number kills"><span> 1</span>
        <p>Kills</p>
      </div>
      <div class="number deaths"><span>9 </span>
        <p>Deaths</p>
      </div>
      <div class="number GPM"><span> 24</span>
        <p>GPM</p>
      </div>
    </div>
  </div>
</div>
<!-- end of squad div-->
<div id="myTeam" ondrop="drop(event, this)" ondragover="allowDrop(event)">
  <h1>My Team</h1>

</div>
<div id="scores">
  <h1>My Team Scores</h1>

</div>

【讨论】:

  • 完美!正是我需要的。
  • 我对 react 也有同样的问题,但我不确定如何用组件来实现它。我应该将下拉事件传递给任何子组件吗?好像有点忙。
  • 这对我帮助很大,元素是真正的解决方案!!
  • 那是一条命 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 2011-06-23
  • 1970-01-01
  • 2020-01-31
相关资源
最近更新 更多