【问题标题】:jQuery UI - Draggable not working right after droppedjQuery UI - 拖放后可拖动无法正常工作
【发布时间】:2013-01-05 02:30:37
【问题描述】:

HTML:

<div class="character_list">
   <div id="draggable" class="character_list_container">
      <div><img  class="1" src="http://ahna.web44.net//img/charas/13.png" /></div>
      <div><img class="2" src="http://ahna.web44.net//img/charas/13.png" /></div>
      <div><img class="3" src="http://ahna.web44.net//img/charas/13.png" /></div>
      <div><img  class="4" src="http://ahna.web44.net//img/charas/13.png" /></div>
      <div><img class="5" src="http://ahna.web44.net//img/charas/13.png" /></div>
      <div><img class="6" src="http://ahna.web44.net//img/charas/13.png" /></div>
   </div>
   <div id="droppable_slots" class="current_team">
      <div id="slot" class="1">1</div>
      <div id="slot" class="2">2</div>
      <div id="slot" class="3">3</div>
   </div>
</div>​

jQuery:

$(function() {
    $("#draggable>div>img").draggable({
        start: function(){
           $(this).css({display: 'none'});
        },
        stop: function(){
           $(this).css({display: 'block'});
        },
        revert: function(dropped) {
           var dropped = dropped && dropped[0].id== "slot";
           if(!dropped) {
              $(this).appendTo($(this).data('originalParent'))
            }
            return !dropped;
        },
        helper: function() { return $(this).clone().appendTo('body').show(); },
        containment: '.sel_screen_left'
}).each(function() {
    $(this).data('originalParent', $(this).parent())
});

$("#droppable_slots>div").droppable({
    drop: function(event, ui) {

        var $this = $(this);
    var content = $.trim($this.html()).length;
    if(content > 0) {
    $this.html("");
    }
        $this.append(ui.draggable);    

        var width = $this.width();
        var height = $this.height();
        var cntrLeft = (width / 2) - (ui.draggable.width() / 2);
        var cntrTop = (height / 2) - (ui.draggable.height() / 2);

        ui.draggable.css({
            left: cntrLeft + "px",
            top: cntrTop + "px"
        });

}
});
});​

现场示例:http://jsfiddle.net/CVbzg/3/

正如您在 jsfiddle 示例中所见,当图像被放置时,它会完美锁定,但是当您移出放置区域时,它会失去可拖动性,而不是恢复并附加到其原始父级。

有人可以帮忙吗?

【问题讨论】:

  • 重复的 ID 是无效的顺便说一句。
  • 这不是您的主要问题,但您已将 slot ID 分配给 3 个元素。它是无效的 HTML,除了具有该 ID 的第一个元素之外的所有元素都无法使用该 ID 访问。
  • 我将如何解决它?还原代码使用它来检查它是否是有效的放置点。
  • 可以将其设为课程并与hasClass 核对。我无法重现您的“失去可拖动性”问题,我注意到的唯一问题是由于您将其附加到还原中间的原始容器,它会向后设置动画。这可以通过使用revertDuration:0 删除该效果来解决。这是一个没有重复 ID 和动画的小提琴:jsfiddle.net/CVbzg/4
  • 哦,当你稍微移出一点时,它会失去可拖动性。此外,如果你把一个放在另一个里面,它们就会消失。

标签: jquery html css jquery-ui drag-and-drop


【解决方案1】:

当你将droppable放在放置目标中后稍微移动它并失去可拖动性,这是因为

$this.html("");

在放置处理程序中,可拖动对象仍在放置目标内。当您删除放置目标的 HTML 时,您还删除了应该重新附加的元素。这会返回一个语法错误,因为该元素不再存在,这会中断操作,将克隆留在那里并且可拖动的对象被擦除。

这里有一个快速修复:

drop: function(event, ui) {

    var $this = $(this);
    if ($this.find('.ui-draggable').length) return; //don't overwrite occupied spot
    $this.empty(); //empty() sounds more semantic than html('') for me, it does the same thing =]
    $this.append(ui.draggable);
    //...
}

Fiddle

它不允许另一个元素覆盖放置目标内的放置元素,其中包括在自己的放置目标上重新放置元素。


另一种解决方案是在附加被拖放的可拖动对象之前将已拖放的可拖动对象移回其起始位置:

drop: function(event, ui) {
    var $this = $(this),
        containsDropped = $this.find('.ui-draggable');
    if (containsDropped.length) containsDropped.appendTo(containsDropped.data('originalParent'));
    $this.empty();

Fiddle

您只需要注意不要无意中擦除可拖动对象。 =]

【讨论】:

  • 为什么1,2,3在你把一个draggable放在上面然后把它取下来的时候会消失?
  • @CodyGuldner 因为 OP 在放置处理程序中的放置目标上调用 .html('')/.empty()。不确定这是不是有意的。
  • 我想使用这段代码,但是你知道有没有办法让它在你将图像拖到其中一个框上时,它会重定向到另一个页面?
  • 当然,在drop: 函数中确定您丢弃的图像或丢弃的容器(根据您自己的标准)并调用location = 'http://redict.to/path';
  • 我不会使用图像,我想制作一个可拖动的菜单。 (很抱歉发送垃圾邮件。我被禁止提问)。见这里jsfiddle.net/burn123/PCQ62
猜你喜欢
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2021-10-31
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多