【问题标题】:Reset Droppable Jquery重置 Droppable Jquery
【发布时间】:2016-05-27 14:42:19
【问题描述】:

我有一个用作文件管理器的简单脚本。这个想法是选择一组文件/目录并将它们放到另一个目录中。但是,如果一个目录是 .ui 选择的,那么它不应该是可放置的。如果我只选择一组文件/目录一次,那么到目前为止我所拥有的当前脚本可以按预期工作,但是如果我取消选择并重新选择另一个组,它将不再有效。

这是一个演示问题的小提琴:https://jsfiddle.net/3gggh6bg/19/

这里是js:

$(function() {
  $("#filemanager").selectable({
    filter: 'tr',
    start: function() {
      $("tr.ui-selected").each(function() {
        $(this).draggable('destroy');
      });
    },
    stop: function() {
      $("tr.ui-selected").draggable({
        helper: function() {
          var dom = [];

          dom.push("<div style=\"border:2px solid black;width:50px;height:20px;line-height:25px;\">",
            "<center>Files Selected: 1</center></div>");

          return $(dom.join(''));
        },

        revert: 'invalid',
        appendTo: 'parent',
        containment: '#filemanager',
        axis: 'y',
        cursor: '-moz-grabbing'
      });

      $(".droppable").not('.ui-selected').droppable({
        //accept: ".ui-selected",
        //activeClass: "ui-state-hover",
        hoverClass: "ui-state-active",
      });
    }
  });
});

任何帮助表示赞赏!谢谢!

【问题讨论】:

  • 欢迎来到 Stack Overflow。我看过你的小提琴,但仍然不确定什么不起作用。当我选择一行并拖动它时,我可以将它放到另一行上。然后我可以对其他行重复此操作。
  • 如果您选择前 3 个 droppable 并将顶部选定的 droppable 拖到选定的底部 2 个 droppable 上,它们将不起作用(如预期的那样)。但是,如果您尝试在底部 3 上再次执行此操作而不刷新页面,它仍会将顶部 3 保持为选中状态,而不是底部 3。ui-selected 似乎没有重置。我希望这是有道理的,如果你需要我,我可以制作一个很好的 gif 来演示这个问题。
  • 仍然无法复制问题,并且仍然不清楚您要完成什么。可选似乎工作正常。
  • 如果 droppable 行的类 ui-selected 则 droppable 将不再起作用。这仅适用一次,如果您重新选择不同的 droppables 组,ui-selected 似乎会坚持选择的最后一组。 imgur.com/SCNGFdK 显示问题。它适用于第一个选定的组,但之后它不再按预期工作(如果 droppable 已选择 ui,则不再是 droppable)。
  • 好的,所以当我选择多行时,没有函数可以从现在为ui-selected 的那些项目的类列表中删除droppable。我在我选择的行上看到了以下类:selectable droppable ui-selectee ui-selected ui-draggable ui-draggable-handle 我想我想了解您预期会发生什么。

标签: jquery jquery-ui jquery-ui-draggable jquery-ui-droppable jquery-ui-selectable


【解决方案1】:

我们忽略了一个事件。我怀疑我正在使用与您相同的逻辑对此进行调查。当stop 事件被触发时,我应该能够找到未选中的项目或选中的项目,并使一些可放置,而另一些则保持不变。

最初是这种情况,但我们未能查看的事件是unselected 事件。当项目的状态从选中更改回未选中时会触发此事件。这是我最终得到的结果:

https://jsfiddle.net/Twisty/3gggh6bg/21/

jQuery

$(function() {
  $("#filemanager").selectable({
    filter: 'tr',
    start: function() {
      $("tr.ui-selected").each(function() {
        $(this).draggable('destroy');
      });
    },
    selected: function(e, ui) {
      console.log(e.target, " Selected triggered.");
      $(ui.selected).removeClass("droppable");
    },
    stop: function() {
      console.log("Stop triggered.");
      $("tr.ui-droppable").droppable("destroy");
      $("tr.ui-selected").draggable({
        helper: function() {
          var c = $("tr.ui-selected").length;
          var $h = $("<div>", {
            class: "ui-helper"
          }).css({
            display: "block",
            border: "2px solid black",
            width: "50px",
            height: "20px",
            "line-height": "25px"
          }).html("<center>Files Selected: " + c + "</center>");
          return $h;
        },
        revert: 'invalid',
        appendTo: 'parent',
        containment: '#filemanager',
        axis: 'y',
        cursor: '-moz-grabbing'
      });
      $("tr.droppable").droppable({
        hoverClass: "ui-state-active"
      });
    },
    unselected: function(e, ui) {
      console.log(e.target, "Unselect triggered.");
      $(ui.unselected).addClass("droppable");
      $("tr.droppable").droppable({
        hoverClass: "ui-state-active"
      });
    }
  });
});

这会在每次选择项目时重置所选项目的droppable 状态。如果这不符合您的预期,请发表评论并提供更多信息。

【讨论】:

  • 这很棒!谢谢!很抱歉,我没有足够快地回复您的评论,也没有更好地解释这个问题。对于任何想要开箱即用的未来用户,我添加了$(ui.unselected).not('.file').addClass("droppable"); 并将类文件添加到不可放置的元素中,因此当调用 unselected 时,它会将可放置的元素添加回正确的元素。另外,我之前在启动函数中尝试过.droppable("destroy");,但它完全无法选择重新启动,我不确定为什么它适用于您的示例。我没有尝试未选择的 fctn。
  • 这是由于在尝试运行 destroy 选项时未将元素分配为 droppable。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 2012-01-14
  • 2021-06-05
  • 2014-05-07
  • 2013-06-22
相关资源
最近更新 更多