如何让人们将LI拖放到列表中的特定位置? (执行console.log问题)

问题描述:

我面临两个问题,其中一个是一个目标,其中之一是未能获得的console.log信息()调用。如何让人们将LI拖放到列表中的特定位置? (执行console.log问题)

让我们看看第一个目标:

我有一个在的jsfiddle为https://jsfiddle.net/L7sbhzzj/一个项目,我的工作。我工作的代码是:

jQuery('.collection').droppable(
    { 
    'accept': '.collection > li', 
    'drop': function(e, ui) 
     { 
     console.log('Reached here!'); 
     console.log(this); 
     jQuery('#selection').append(ui.draggable); 
     } 
    }); 

从本质上讲,我希望人们能够拖放元素列表上的特定位置。因此,在JSfiddle中,您可以将“小说”拖到右侧,但如果您这样做,然后拖过“非小说类”,“非小说类”只会添加到最后;你不可能在“小说”之前和之后拖拽“非小说类”。

我想避免重蹈覆辙;我想有一些标准模式,比如“把LI放在目标UL的LI之前,这个LI距页面顶部的距离最小,但仍等于或大于LI到页面顶部的距离”。

现在回到我面临的另一个问题:或者jQuery('#selection').append(ui.draggable);正在工作,或者其他人正在做同样的工作,但我的console.log()中没有一个似乎被报告。

我有如何实现的东西的一些想法,但它会是不错的反思和获得的console.log()S'诊断输出,而我工作的事情。

是在'drop'生效呢?它以其他方式工作吗?我怎样才能得到物体掉到什么元素之类的东西?

- 编辑 -

我才发现自己问的是我想做的一面。我希望人们能够将XYZ项从一个容器移到另一个容器,然后如果他们改变了主意,就可以回来。 Snowmonkey的解决方案非常适用于可排序的正确列表。但是,下面的改编失败了,也许是因为我叫了两个不兼容的增强功能:

jQuery(function() 
{ 
jQuery('#selection').sortable(
    { 
    }); 
jQuery('li', jQuery('#source')).draggable(
    { 
    'connectToSortable': '#selection', 
    'cancel': 'a.ui-icon', 
    'revert': 'invalid', 
    'containment': 'document', 
    'cursor': 'move' 
    }); 
jQuery('#source').sortable(
    { 
    }); 
jQuery('li', jQuery('#selection')).draggable(
    { 
    'connectToSortable': '#selection', 
    'cancel': 'a.ui-icon', 
    'revert': 'invalid', 
    'containment': 'document', 
    'cursor': 'move' 
    }); 

我怎样才能得到Snowmonkey的回答完全双面变化?

感谢,

所以你要连接拖动到一个排序?这是一个简单的方法。完全摆脱droppable,只需将'connectToSortable'规则添加到您的可拖动。因此,#选择仍然是可排序的,#source仍然是可拖动的,可以放到#source的任何位置。

jQuery(function() { 
 

 
    $(".collection").sortable({ 
 
    }); 
 
    
 
    jQuery('li', jQuery('.collection')).draggable({ 
 
    'connectToSortable': '.collection', 
 
    'cancel': 'a.ui-icon', 
 
    'revert': 'invalid', 
 
    'containment': 'document', 
 
    'cursor': 'move' 
 
    }); 
 
});
body { 
 
    background-color: #ccc; 
 
    font-family: Verdana, Georgia; 
 
} 
 

 
div.main { 
 
    margin-left: auto; 
 
    margin-right: auto; 
 
    width: 440px; 
 
} 
 

 
div.table { 
 
    display: table; 
 
    width: 440px; 
 
} 
 

 
div.td { 
 
    display: table-cell; 
 
    width: 50%; 
 
} 
 

 
div.tr { 
 
    display: table-row; 
 
} 
 

 
ul.collection { 
 
    background-color: white; 
 
    list-style: none; 
 
    padding-left: 0; 
 
    min-height: 100px; 
 
    padding-left: 0; 
 
    width: 200px; 
 
} 
 

 
ul.collection > li {} 
 

 
ul#selection { 
 
    float: right; 
 
} 
 

 
ul#source { 
 
    float: left; 
 
}
<link href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet"/> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> 
 
<div class="main"> 
 
    <div class="table"> 
 
    <div class="tr"> 
 
     <div class="td"> 
 
     <ul id="source" class="collection"> 
 
      <li>Everything</li> 
 
      <li>Nonfiction</li> 
 
      <li>Fiction</li> 
 
      <li>Poetry</li> 
 
     </ul> 
 
     </div> 
 
     <div class="td"> 
 
     <ul id="selection" class="collection"> 
 
      <li>Empty</li> 
 
     </ul> 
 
     </div> 
 
    </div> 
 
    </div> 
 

 
</div>

所以我更新了上述职位,使其在两个方向上工作。我没有使用这两个元素的ID,而是使用了他们共同的类。两个.collection元素都是可排序的,并且都是connectToSortable .collection元素。希望能帮助到你!

+0

谢谢(对于我的背景,你是如何得到你的答案格式?这很可爱!)。这可以根据需要进行排序,但如同现在在问题中编辑的那样,我希望这两种功能都可以工作。你是否愿意重读扩展的问题并告诉如何使它同时工作?谢谢, – JonathanHayward

+1

@JonathanHayward,我更新了上面的代码块来做你正在寻找的东西。我使用了ID来明确它,但是如果你希望它能够双向工作,只需使用类而不是ID。当我在回答问题时,我点击了我的文本输入字段上方的“代码”按钮,以创建相当格式的工作代码。 ;) – Snowmonkey

+0

好的;谢谢。有一个CSS说明我想知道你是否有评论(我是否应该提出一个单独的问题?):如果任何一个UL为空,则它是交错的,如https://cjshayward.com/wp-content/project/staggered.png ;他们看起来是错开的,因此一个顶部与另一个的底部齐平,并且存在一个令人讨厌的闪烁效果,从左向右传递最后一个元素。我想要什么,当它们都是非空的时候会发生什么,因为它们都是在顶部一直齐平,就像在https://cjshayward.com/wp-content/project/flush.png中一样。任何方式来强制这在CSS中? – JonathanHayward

你可以实现你想要的只是使用jquery ui sortable。如果您希望在项目添加到选择时收到通知,您可以收听接收事件。

jQuery(function() 
{ 
jQuery("#source").sortable({ 
    connectWith: "#selection", 
}).disableSelection(); 

jQuery("#selection").sortable({ 
    receive: function() { 
    console.log("changed"); 
    } 
}) 
});