jQuery可在两个容器之间拖放和放置并可排序

时间:2013-01-13 21:21:39

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

我正在尝试开发一个具有以下功能的小页面:

  1. Page将有两个div:一个是#origin,包含很多缩略图,第二个是#drop,可以放下图像(最多只有3个)。
  2. 需要可以将图像从#drop拖放回原点。
  3. #drop需要是可排序的,因为3个所选图像的顺序很重要。
  4. 当放在#drop上时,图像应该对齐,好像它们原来从头开始就像那样显示。
  5. 之前我从未使用过jQuery,之前我甚至有一个工作页面原型,我已经通过本机HTML5拖放事件在两个容器之间进行拖放,但是当我添加sortable()jquery功能时#drop,图像无法再被拖回#origin,这会破坏我的功能。

    所以,我重新开始并希望实现拖拽和放大删除功能以及使用jQuery进行排序。我已经阅读了所有可拖动,可放置和可排序功能的完整API,但是我无法让它工作。不确定这是我用于每个功能的设置。

    在小提琴上,您可以看到图像变得可拖动,我可以看到我指定的设置(不透明度,光标),但图像不能放在#drop上。

    根据我的理解,使图像可拖动,图像具有“可拖动”类,并使#drop droppable接受“.draggable”的组合,它应该允许最基本的功能,但即便如此好像好吗。另外我读到如果draggable和droppable都具有相同的“范围”设置,它也应该有效,但事实并非如此。

    这是页面代码的简单版本,加上jsFiddle:http://jsfiddle.net/39khs/

    代码:

    的CSS:

    #origin {
      background-color: green;
    }
    #drop {
      background-color: red;
      min-height: 120px;
    }
    

    JS:

    $("img").draggable({ helper: "clone", opacity: 0.5, cursor: "crosshair", scope: "drop" });
    $("#drop").droppable({ accept: ".draggable", scope: "drop"});
    $("#drop").sortable();
    

    HTML:

    <div id="wrapper">
        <div id="origin" class="fbox">
            <img src="http://placehold.it/140x100" id="one" title="one" class="draggable" />
            <img src="http://placehold.it/140x100" id="two" title="two" class="draggable" />
            <img src="http://placehold.it/140x100" id="three" title="three" class="draggable" />
        </div>
      <p>test</p>
        <div id="drop" class="fbox">
    
        </div>
    </div>
    

    非常感谢任何帮助。

2 个答案:

答案 0 :(得分:64)

这是最终结果的小提琴:

http://jsfiddle.net/39khs/82/

关键是处理“drop”事件并手动从#origin中删除已删除的图像并将其添加到#drop。这实际上是我在第一次实现时所做的,但不知道如何使用jQuery完成它:

 $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn);

我不确定为什么jQuery没有真正从旧容器中删除被拖动的元素并将其添加到新容器中,但这是必须要做的事情才能使新删除的项目正确显示而不仅仅是它在哪里被放弃了,无视css放置/造型。

关键是@Barry Pitman关于以下SO问题:

jQuery draggable + droppable: how to snap dropped element to dropped-on element

更新:我今天有空闲时间,想要检查一下是否可以进行排序,而且看哪,是的。

http://jsfiddle.net/wj4ak/5/

只需两行代码即可从一个容器拖放到另一个容器,并对项目进行排序。它们根本不需要在ul / ol列表中。令人烦恼的是,我并不打算让原点div上的项目可以排序,但这是我现在可以忍受的东西。

答案 1 :(得分:21)

如果您想使用.droppable().draggable(),&amp; .sortable(),那么您只需要使用.sortable()

使用你的jsfiddle,我做了以下更改:

HTML:

<div id="wrapper">
    <div id="origin" class="fbox">
    <ul id="sort1" class="list">
      <li><img src="http://placehold.it/140x100" id="one" title="one" class="draggable" /></li>
      <li><img src="http://placehold.it/140x100" id="two" title="two" class="draggable" /></li>
      <li><img src="http://placehold.it/140x100" id="three" title="three" class="draggable" /></li>
    </ul>
    </div>
  <p>test</p>
    <div id="drop" class="fbox">
      <ul id="sort2" class="list"></ul>
    </div>
</div>

JAVASCRIPT:

$( "#sort1, #sort2" ).sortable({
      helper:"clone", 
      opacity:0.5,
      cursor:"crosshair",
      connectWith: ".list",
      receive: function( event, ui ){ //this will prevent move than 3 items in droppable list
         if($(ui.sender).attr('id')==='sort1' && $('#sort2').children('li').length>3){
           $(ui.sender).sortable('cancel');
         }
      }
});

$( "#sort1,#sort2" ).disableSelection();

CSS:

#origin
{
  background-color: green;
}
#drop
{
  background-color: red;
  min-height: 120px;
}
.list
{ 
  min-height: 120px;
} 
.list li
{
 display: inline-block;
 list-style-type: none;
 padding-right: 20px;
}

DEMO:http://jsfiddle.net/39khs/80/

希望这有帮助,如果您有任何问题,请告诉我们!

<小时/> 链接: