我目前正在开发一项功能,我需要同时将可放置,可拖动和可排序的功能组合在一起。下面是我的测试代码。我很抱歉,因为我无法获得此代码的jsfiddle。 Droppable和Draggable工作正常。
问题:我很难在我的droppable div中进行水平排序。如果有人可以帮助/指导我在排序列表中获取元素的索引/位置,无论元素是在第1个,第2个等位置,我将不胜感激。
HTML:
<ul id="gallery" class="gallery ui-helper-reset ui-helper-clearfix">
<li class="ui-widget-content ui-corner-tr">
<div class="ui-widget-header">High Tatras 1</div>
</li>
<li class="ui-widget-content ui-corner-tr">
<div class="ui-widget-header">High Tatras 2</div>
</li>
<li class="ui-widget-content ui-corner-tr">
<div class="ui-widget-header">High Tatras 3</div>
</li>
<li class="ui-widget-content ui-corner-tr">
<div class="ui-widget-header">High Tatras 4</div>
</li>
</ul>
<div id="trash" class="ui-widget-content ui-state-default">
<ul id = "sortable" class='gallery ui-helper-reset sortable'></ul>
</div>
以上是我用作测试数据的HTML代码。
JQuery:下面是我目前正在使用的Jquery代码。
var $gallery = $( "#gallery" ),
$trash = $( "#trash" );
// let the gallery items be draggable
$( "li", $gallery ).draggable({
cancel: "a.ui-icon", // clicking an icon won't initiate dragging
revert: "invalid", // when not dropped, the item will revert back to its initial position
containment: "document",
helper: "clone",
cursor: "move"
});
// let the trash be droppable, accepting the gallery items
$trash.droppable({
accept: "#gallery > li",
activeClass: "ui-state-highlight",
drop: function( event, ui ) {
addToContainer( ui.draggable );
}
});
// let the gallery be droppable as well, accepting items from the trash
$gallery.droppable({
accept: "#trash li",
activeClass: "custom-state-active",
drop: function( event, ui ) {
RemoveFromContainer( ui.draggable );
}
});
function addToContainer( $item ) {
$item.fadeOut(function() {
var $list = $( "ul", $trash );
$item.appendTo($list).fadeIn(function() {
$item
.addClass('ui-state-default')
.find( "div .ui-widget-header" )
.animate({ height: "36px"});
});
});
$( ".sortable" ).sortable({
connectWith: "#sortable"
}).disableSelection();
}
function RemoveFromContainer( $item ) {
$item.fadeOut(function() {
$item
.find( "a.ui-icon-refresh" )
.remove()
.end()
.css( "width", "96px")
.find( "img" )
.css( "height", "72px" )
.end()
.appendTo( $gallery )
.fadeIn();
});
}
// resolve the icons behavior with event delegation
$( "ul.gallery > li" ).click(function( event ) {
var $item = $( this ),
$target = $( event.target );
if ( $target.is( "a.ui-icon-trash" ) ) {
addToContainer( $item );
} else if ( $target.is( "a.ui-icon-refresh" ) ) {
RemoveFromContainer( $item );
}
return false;
});
如果我遗失了某些内容并且未能发布正确的问题,请告诉我。我对stackoverflow做了一些研究,但仍然无法找到确切的解决方案。非常感谢你提前。
答案 0 :(得分:1)
使用2 sortable
并将connectWith
属性设置为彼此:
var $gallery = $("#gallery"),
$trash = $("#trash");
$("#gallery").sortable({
connectWith: "#trash",
helper: "",
revert: "invalid",
start: function (event, ui) {
var $item = ui.helper;
$item.css({
'width': $('#gallery li').width()
});
},
stop: function (event, ui) {
//get what you want here
}
});
$('#trash').sortable({
placeholder: "ui-state-highlight",
connectWith: '#gallery',
revert: true,
cursor: "move",
items: "li",
drop: function (event, ui) {
},
stop: function (event, ui) {
var $obj = $(ui.item);
//get what you want here
}
});
尝试小提琴: