javascript - HTML5 拖放 - 仅适用于每个拖放区的项目

标签 javascript jquery html drag-and-drop

我有一些 div 作为拖放区,一些作为可拖动对象。

<div class="container">
   <div class="drop"></div>
   <div class="drop"></div>
   <div class="drop"></div>
</div>
<div class="container">
    <div class="drag" id="drag-a" draggable="true">box a</div>
    <div class="drag" id="drag-b" draggable="true">box b</div>
    <div class="drag" id="drag-c" draggable="true">box c</div>
</div>
<style>
.drop {
    border: 1px solid #000;
    height: 40px;
    margin: 5px;
    width: 200px;
}
.drag {
    background: #000;
    color: #fff;
    display: inline-block;
    margin: 5px;
    padding: 5px;
    user-select: none;
}
</style>
<script>
$(document).ready(function () {
    $('.drop').on('dragover', function(e){
        e.preventDefault();
    });
    $('.drag').on('dragstart', function(e) {
        e.originalEvent.dataTransfer.setData('Text', e.target.id);
    });
    $('.drop').on('drop', function(e) {
        e.preventDefault();
        var data = e.originalEvent.dataTransfer.getData('Text');  
        e.target.appendChild(document.getElementById(data));
    });
});
</script>

使用 native HTML5 拖放和 jQuery,效果很好。现在我想将拖放区限制为一项。应该不可能再往这个区域扔一个,但我不知道怎么做。

两个可拖动的框有可能交换位置吗?

最佳答案

您只需要删除该元素的事件处理程序,在 jQuery 中您可以使用 `.off() 来完成此操作.

$('.drop').on('drop', function(e) {
    e.preventDefault();
    var data = e.originalEvent.dataTransfer.getData('Text');  
    e.target.appendChild(document.getElementById(data));
    // add this line
    $(this).off('dragover drop');
});

$(document).ready(function () {
    $('.drop').on('dragover', function(e){
        e.preventDefault();
    });
    $('.drag').on('dragstart', function(e) {
        e.originalEvent.dataTransfer.setData('Text', e.target.id);
    });
    $('.drop').on('drop', function(e) {
        e.preventDefault();
        var data = e.originalEvent.dataTransfer.getData('Text');  
        e.target.appendChild(document.getElementById(data));
        $(this).off('dragover drop');
    });
});
.drop {
    border: 1px solid #000;
    height: 40px;
    margin: 5px;
    width: 200px;
}
.drag {
    background: #000;
    color: #fff;
    display: inline-block;
    margin: 5px;
    padding: 5px;
    user-select: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
   <div class="drop"></div>
   <div class="drop"></div>
   <div class="drop"></div>
</div>
<div class="container">
    <div class="drag" id="drag-a" draggable="true">box a</div>
    <div class="drag" id="drag-b" draggable="true">box b</div>
    <div class="drag" id="drag-c" draggable="true">box c</div>
</div>

重新启动拖放功能

即使您将每个放置区限制为只有一个框,一种常见的情况是允许用户删除放置的框并放置另一个框。

首先,您应该在命名函数声明中转换匿名函数处理程序,以便能够重用它们。

然后,允许盒子容器接受拖放操作。

最后,当用户在容器中放置一个框时,在任何空放置区域中再次添加 dropdragover 事件的处理程序。

注意:这一次,我对类的名称做了一些修改,以使其更加清晰。

var dragOverHandler = function(e) {
  e.preventDefault();
};
var dropOnDropZoneHandler = function(e) {
  e.preventDefault();
  var data = e.originalEvent.dataTransfer.getData('Text');
  e.target.appendChild(document.getElementById(data));
  $(this).off('dragover drop');
};
var dropOnBoxContainerHandler = function(e) {
  e.preventDefault();
  var data = e.originalEvent.dataTransfer.getData('Text');
  e.target.appendChild(document.getElementById(data));
  $('.dropzone').each(function() {
    if ($(this).is(':empty')) {
      $(this).on('dragover', dragOverHandler);
      $(this).on('drop', dropOnDropZoneHandler);
    }
  });
}

$(document).ready(function() {
  $('.box').on('dragstart', function(e) {
    e.originalEvent.dataTransfer.setData('Text', e.target.id);
  });
  $('.dropzone, #boxContainer').on('dragover', dragOverHandler);
  $('.dropzone').on('drop', dropOnDropZoneHandler);
  $('#boxContainer').on('drop', dropOnBoxContainerHandler);
});
.dropzone, #boxContainer {
  border: 1px solid #000;
  height: 40px;
  margin: 5px;
  width: 200px;
}

.box {
  background: #000;
  color: #fff;
  display: inline-block;
  margin: 5px;
  padding: 5px;
  user-select: none;
}

#boxContainer {
  background-color: #AAA;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
  <div class="dropzone"></div>
  <div class="dropzone"></div>
  <div class="dropzone"></div>
</div>
<div id="boxContainer">
  <div class="box" id="drag-a" draggable="true">box a</div>
  <div class="box" id="drag-b" draggable="true">box b</div>
  <div class="box" id="drag-c" draggable="true">box c</div>
</div>

关于javascript - HTML5 拖放 - 仅适用于每个拖放区的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53067098/

相关文章:

javascript - 如何更改angularjs单页应用程序中的元标记内容?

javascript - 访问动态创建的组件的 prop

html - 使用 css 将句子分成两半并显示在文本字段中

javascript - jQuery 不工作

javascript - 在页面加载时执行 javascript

javascript - 从 js 文件启动 SQL 查询

jquery - 无法将数组作为表单参数发送

javascript - 如何在 jquery 中制作背景幻灯片?

jquery - 动态(变量)变量(如 php 中的?)

html - CSS:em 值是最重要的