【问题标题】:Dragula dropping a different element than draggedDragula 放置与拖动不同的元素
【发布时间】:2016-03-23 17:35:00
【问题描述】:

在 Dragula 中,您可以通过一种方式从一个容器复制到另一个容器 - 我想将其用于 UI,您可以将代表元素的符号拖到容器中并让它产生“真正的交易” - 真正的交易是任意不同的元素。

其中大部分都非常简单:

dragula([].slice.call(document.querySelectorAll('.container')), {
  copy: function (el, source) {
    return source === document.getElementById('c1')
  },
  accepts: function (el, target) {
    return target !== document.getElementById('c1')
  },
  removeOnSpill: true
}).on('drop', function (el) {
    var newNode = document.createElement("div");
    newNode.textContent = "The real deal";
    newNode.classList.add("elem");
    el.parentNode.replaceChild(newNode, el);
});
.container {
  border: 1px solid #000;
  min-height:50px;
  background:#EEE;
}
.elem {
  padding:10px;
  border: 1px solid #000;
  background:#FFF;
  margin:5px;
  display: inline-block;
}
<div id="c1" class="container">
  <div class="elem">Icon1</div>
  <div class="elem">Icon2</div>
  <div class="elem">Icon3</div>
  <div class="elem">Icon4</div>
  <div class="elem">Icon5</div>
  <div class="elem">Icon6</div>
</div>
<div id="c2" class="container"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dragula/3.6.8/dragula.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/dragula/3.6.8/dragula.min.css" rel="stylesheet"
      />

如您所见 - 这将替换放置时的元素,给我想要的结果。但是,拖拽时的重影还是原来的“Symbol”元素。

是否可以在拖动时替换“待拖放”元素,以使幻影和最终结果看起来都像所需的元素?

【问题讨论】:

    标签: javascript html drag-and-drop dragula


    【解决方案1】:

    有一个shadow 事件在拖动过程中反复触发。我以为我可以用它来替换阴影元素,但它似乎 dragula 保留了对它的引用,所以如果我删除它,它将停止工作。

    显然,解决这个问题的最干净的方法是将原来的 ghost 设置为 display: none,然后在它旁边放另一个,然后在 dragend 上清理它。

    我不知道真假阴影元素之间的大小差异是否会破坏定位。当我到达时,我会过那座桥。

    function makeElement(){
        var newNode = document.createElement("div");
        newNode.textContent = "Wootley!";
        newNode.classList.add("elem");
        return newNode;
    }
    
    dragula([].slice.call(document.querySelectorAll('.container')), {
      copy: function (el, source) {
        return source === document.getElementById('c1')
      },
      accepts: function (el, target) {
        return target !== document.getElementById('c1')
      },
      removeOnSpill: true
    }).on('dragend', function (el) {
        this._shadow.remove();
        this._shadow = null;
    }).on('drop', function (el) {
        el.parentNode.replaceChild(makeElement(), el);
    }).on('shadow', function(el, target){
        if (!this._shadow){
            this._shadow = makeElement();
            this._shadow.classList.add("gu-transit");
        }
        el.style.display = 'none';
        el.parentNode.insertBefore(this._shadow, el);
    });
    .container {
      border: 1px solid #000;
      min-height:50px;
      background:#EEE;
    }
    .elem {
      padding:10px;
      border: 1px solid #000;
      background:#FFF;
      margin:5px;
      display: inline-block;
    }
    <div id="c1" class="container">
      <div class="elem">Icon1</div>
      <div class="elem">Icon2</div>
      <div class="elem">Icon3</div>
      <div class="elem">Icon4</div>
      <div class="elem">Icon5</div>
      <div class="elem">Icon6</div>
    </div>
    <div id="c2" class="container"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/dragula/3.6.8/dragula.min.js"></script>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/dragula/3.6.8/dragula.min.css" rel="stylesheet"
          />

    【讨论】:

    猜你喜欢
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多