限制可拖动元素的放置区域

4
我一直在做一个需要使用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

2个回答

7
您可以使用data属性逻辑并进行以下三个简单的修改来实现此目的:
1) 将data-appendto="green"blue属性添加到可拖动元素的属性中。
2) 将data-boxtype="red"blue属性添加到您要拖动元素追加的div元素中。
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));
}

非常感谢,伙计。我已经进行了一些测试,我认为这将会起作用。 - Alvaro Menéndez
所有的工作都正常吗?还是仍然存在一些问题? - Armen

0

好的回答,Armen。但是如果你想在dragover事件中处理访问权限,那么添加另一个属性,只需简单地设置为yes。

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

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

步骤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");
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接