【问题标题】:Restrict drop areas to some draggable elements将放置区域限制为某些可拖动元素
【发布时间】:2016-03-27 11:02:32
【问题描述】:

我一直在做一个需要 HTML5 拖放的项目,我被一些可能很容易实现但我似乎找不到解决方案的事情困住了。

基本上我有一些可拖动的元素和一些放置区域。因为它总是更容易用一个工作示例来解释,所以我做了这个简单的 JSFIDDLE

现在您可以将任何元素拖入任何放置区域或根据需要将它们移出,但我想要实现的是让橙色框仅放置在任何绿色区域中(并忽略蓝色区域...如果你把它放在那里,让它回到原来的位置),红色的盒子正好放在蓝色的盒子里(忽略绿色的)。

任何人都可以帮助我或提示我解决此问题的方法吗?

    function DragOver(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));
    }


    var elemens = document.querySelectorAll('.draggable');
    [].forEach.call(elemens, function(elem) {
      elem.addEventListener('dragover', DragOver, false);
      elem.addEventListener('drop', Drop, false);
    });
   #divContenedor {
     width: 950px;
     height: 500px;
   }
   
   #div1,
   #div2,
   #div3 {
     width: 350px;
     height: 70px;
     border: 1px solid #aaaaaa;
     background-color: green;
   }
   
   #div4 {
     width: 350px;
     height: 70px;
     border: 1px solid #aaaaaa;
     background-color: blue;
   }
<p>
  Drag&drop testing</p>
<div id="divContenedor" class="draggable" style="background-color: yellow; width: 100%; float: left; position: relative;">
  <div id="drag1" draggable="true" ondragstart="Drag(event)" style="width: 336px; height: 69px; background-color: orange; cursor: move;">1</div>
  <div id="drag2" draggable="true" ondragstart="Drag(event)" style="width: 336px; height: 69px; background-color: orange; cursor: move;">2</div>
  <div id="drag3" draggable="true" ondragstart="Drag(event)" style="width: 336px; height: 69px; background-color: red; cursor: move;">3</div>
</div>
<div style="position: absolute; top: 100px; left: 500px;">
  <div id="div1" class="draggable" ></div>
  <br />
  <div id="div2" class="draggable" ></div>
  <br />
  <div id="div3" class="draggable" ></div>
  <br />
  <div id="div4" class="draggable" ></div>
</div>

使用@Amen 解决方案更新JSFIDDLE

【问题讨论】:

    标签: javascript html drag-and-drop draggable


    【解决方案1】:

    您可以使用data 属性逻辑并进行以下 3 次简单修改来实现该目标

    1) 添加draggable元素属性data-appendto="green"blue

    2) 添加到div 元素,您可拖动的元素应附加data-boxtype="red"blue

    3) 在Drop(ev) 函数中,您可以检查您的document.getElementById(data)ev.target 数据属性值是否匹配,然后允许丢弃。可以通过js.getAttribute('data-attribute')函数获取元素data-attribute

    if(ev.target.getAttribute('data-boxtype') == 
       document.getElementById(data).getAttribute('data-appendto')){
    
      ev.target.appendChild(document.getElementById(data));
    }
    

    【讨论】:

    • 非常感谢伙计。我已经对其进行了一些测试,我认为这会起作用。
    • 似乎一切正常?还是还有一些问题存在?
    【解决方案2】:

    Armen 的回答很好,但是如果您想处理对 dragover 事件的访问,请添加另一个简单地说是的属性。

    如您所见,我的 JavaScript 模块对象中有 4 个方法,它们都是从拖放元素事件中调用的。

    步骤 1. OnDragStart 事件通过将 data-ts-allowdrop 属性更改为“Yes”(其默认值为 no)来设置阶段,用于匹配其放置元素查询的所有潜在目标。假设一个元素将接受多个来源,我执行包含查询以查找该元素而不是完全匹配

    第 2 步。当拖动到接收元素上时,其 DragOver 事件将检查其“data-ts-allowdrop”属性以查看其是否设置为 true 或“Yes”。如果是这样,那么它会运行 preventDefault 并由 OnDrop 方法允许和处理丢弃,该方法继续关闭“data-ts-allowdrop”属性。

    第 3 步。同时使用 onEnd 将“data-ts-allowdrop”设置为 No,以防拖动事件被取消。

    <div id="divName" draggable="true" ondragstart="tsjDragnDrop.setSource(event);" data-ts-drag-allow-source="admin" tabindex="1" ><span >Item to Drag</span><img alt="an icon" src="~/images/anImage.png"  /></div>
    
    <li ondragover="tsjDragnDrop.allowTarget(event);" ondragleave="tsjDragnDrop.onLeave(event)" ondrop="tsjDragnDrop.onDrop(event)" data-ts-drag-allow-target="admin" data-ts-allowdrop="No" >Drop Target in a list item</li>
    
    
    var DraggnApi = {
        allowTarget: function (event) {
                var source = $(event.currentTarget).attr("data-ts-allowdrop");
                $(event.currentTarget).addClass("ts-dragover");
    
                if (source === "Yes") {
                    event.preventDefault();
                }
            },
    
            onLeave: function (event) {
    
                $(event.currentTarget).removeClass("ts-dragover");
            },
    
            onDrop: function (event) {
                event.preventDefault();
                var source = $(event.currentTarget).removeClass("ts-dragover");
                $(event.currentTarget).attr("data-ts-allowdrop", "No");
            },
    
            onEnd: function (event) {
    
                $(event.currentTarget).attr("data-ts-allowdrop", "No");
            },
    
            setSource: function(e)
            {
                e.dataTransfer.setData("text", "SomeText");
    
                var source = $(event.currentTarget).attr("data-ts-drag-allow-source");
    
                if ($("li[data-ts-drag-allow-target]").attr("data-ts-drag-allow-target").indexOf(source) > -1) {
                    $("li[data-ts-drag-allow-target*='" + source + "']").attr("data-ts-allowdrop", "Yes");
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多