【问题标题】:jQuery UI Droppable - How to allow only 1 element per drop zone, instead of stackingjQuery UI Droppable - 如何只允许每个放置区有 1 个元素,而不是堆叠
【发布时间】:2016-01-26 04:26:29
【问题描述】:

我当前的脚本:https://jsfiddle.net/uoyp37bj/11/

问题在于,目前可以通过将可放置元素相互拖动来“堆叠”可放置元素。我正在努力做到这一点,以便只保留最新删除的元素,并删除任何以前的元素。

我最初只是使用 CSS“隐藏”了其他项目,但由于我使用输入框来跟踪放置区域中存在哪些项目,这不再可能。任何帮助将不胜感激,希望它在 jQuery UI API 中相对简单,但目前对我没有任何帮助。

$(".social-msl-link-label").draggable({
  connectToSortable: ".social-msl-group-list",
  revert: "invalid",
  helper: "clone"
});

var orderMSLids = [];
var droppableOptions = {
  accept: ".social-msl-link-label",
  tolerance: 'pointer',
  greedy: true,
  hoverClass: 'highlight',
  drop: function(ev, ui) {
    orderMSLids = [];
    $(ui.draggable).clone(true).detach().css({
      position: 'relative',
      top: 'auto',
      left: 'auto'
    }).appendTo(this);

    orderMSLids.push($(this).find('.social-msl-link-label').attr('id'));

    $(this).siblings().filter(function() {
      return $(this).text().trim() === $(ui.draggable).text().trim();
    }).empty();

    str = [];
    $(".social-msl-links-order li").each(function(index) {
      var res = $(this).children().attr('id');
      if (res) {
        str.push(res);
      }
    });

    var string = str.join(",");
    $('#msl-order').val(string);


  }
};

$(".social-msl-links-order li.social-msl-drop").droppable(droppableOptions);

$('.social-msl-add').click(function() {
  var $droppable = $('<li class="social-msl-drop"></li>').droppable(droppableOptions);
  $droppable.insertBefore('.social-msl-add');
});

$('#msl-order').prop('value').split(',').forEach(function(id) {
  var $droppable = $('.social-msl-drop.ui-droppable:empty').first();
  if (id) {
    $('.draggable #' + id).clone(true).appendTo($droppable);
  }
});

刚刚有了一个想法,但还没有取得进展——也许可以遍历“drop”调用中的所有元素,并删除任何重复项。在这个循环中,还可以检查是否有任何拖放区有 2 个元素并删除除 1 之外的所有元素。不知道如何编写脚本,但初始逻辑对我来说是有意义的。

【问题讨论】:

  • jsfiddle.net/cjL39f6y 试试这个
  • @RLam 谢谢,真的很感激 - 绝对理解它是如何工作的,我希望它能够做的是“替换”你丢弃的任何东西。因此,如果您将 Link1 放到 Link2 上,Link2 将被移除,只剩下 Link1。
  • jsfiddle.net/z2t0r59c 检查这个。我所做的是为您的克隆元素分配一个变量,并在用户拖动时使用它来删除其他可拖动元素。

标签: javascript jquery css jquery-ui droppable


【解决方案1】:

不要将可拖动对象附加到可放置对象,只需将其全部内容替换为可拖动对象,如下所示:

$(this).html(ui.draggable.clone(true).css({
  position: 'relative',
  top: 'auto',
  left: 'auto'
}));

代替:

 $(ui.draggable).clone(true).detach().css({
  position: 'relative',
  top: 'auto',
  left: 'auto'
}).appendTo(this);

【讨论】:

  • 完美!很有意义,绝对是最干净的解决方案 - 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2023-04-10
  • 2016-04-08
相关资源
最近更新 更多