【发布时间】:2013-04-13 16:29:18
【问题描述】:
我被要求创建一个正方形网格,其中每个正方形可能包含也可能不包含链接,并且这些链接应该能够在网格周围移动。
我认为 draggable/droppable 将是可行的方法,它工作正常,但是,现在我们希望能够在将一个拖放到另一个之上时交换可拖动对象。所以现在看起来 sortable 本来就是要走的路。然而, sortable 看起来更像是用于列表,而我并没有像列表那样写它。
有没有一种简单的方法可以使我到目前为止的工作,或者我需要使用 sortable 完全重写它?我是 javascript 新手,我花了一段时间才走到这一步,而且我不是要代码,但我害怕不得不再次弄清楚整个事情的想法!有什么意见吗?
这是我的代码:http://jsfiddle.net/kvVkT/
和代码:
html
<div id="gridcontainer">
<div id="-2:-2" class="droppable occupied">
<a href="" id ="508" class="bookmark draggable white" title="white" "target="_blank">1</a>
</div>
<div id="-2:-1" class="droppable">2</div>
<div style="clear:both"></div>
<div id="-2:0" class="droppable">3</div>
<div id="-2:1" class="droppable occupied">
<a href="" id ="567" class="bookmark draggable white" title="white" "target="_blank">4</a>
</div>
<div style="clear:both"></div>
</div>
css
#gridcontainer{position:relative;padding:25px;color:#ff0004;background:#ffffff;}
.droppable{width:65px; height:65px;float:left; margin:5px;background:#000000;}
.bookmark {float:left;width:65px; height:65px;display:block;position:absolute;}
.position{float:left;width:65px; height:65px;display:block;}
.position:hover{background-image:url(../img/tilehover.png);}
.bookmark.ui-draggable-dragging {-moz-box-shadow: 0 0 5px #d9d9d9; -webkit-box-shadow: 0 0 5px #d9d9d9; box-shadow: 0 0 5px #d9d9d9;}
.draggable{ background:#888888;}
[draggable] {
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
user-select: none;
}
javascript
$('.draggable').draggable({ start: function() {$('#dropdownAddTile').slideDown();}, stop: function() {$('#dropdownAddTile').slideUp();}, containment: '#container', snap:'.droppable', snapMode:'inner', revert:'invalid',snapTolerance: 32});
$('.droppable').droppable({drop: handleDropEvent, accept: function(e){if(e.hasClass('draggable')) { if (!$(this).hasClass('occupied')) {return true; }}}});
function handleDropEvent( event, ui ) {
event.preventDefault();
var draggable = ui.draggable;
var droppable = $(this);
var droppableId = $(this).attr("id");
var draggableId = ui.draggable.attr("id");
$('.draggable').draggable({containment: '#container', snap:'.droppable', snapMode:'inner', revert:'invalid',snapTolerance: 32});
$('.droppable').droppable({drop: handleDropEvent, accept: function(e){if(e.hasClass('draggable')) { if (!$(this).hasClass('occupied')) {return true; }}}});
var initPosit = ui.draggable.parent().attr('id');
//save new position
$.post("tiles/updateTilePosition", { draggableId:draggableId, droppableId: droppableId }).done(function(data) {
//alert(data);
})
$(this).addClass('occupied');
ui.draggable.parent().removeClass('occupied');
if($(ui.draggable).parent() !==$(this)){
$(ui.draggable).appendTo($( this ));
}
}
任何意见都非常感谢
【问题讨论】:
-
网格的尺寸是多少?最大列/行?您只能移动链接还是 div 可以在网格内移动?
-
另外,是否有任何代码必须保持原样?或者我可以编辑它的任何方面吗?
-
@Dom,感谢您的关注,很抱歉延迟发现您的回复,我在英国。回答你的问题。网格可以由用户添加行或列。这就是为什么每个 droppable 的 id 都像 1:4 这样的原因。只要代码有效,您就可以更改代码的任何方面!目前你只能移动链接,但如果它需要是 div,我想这没关系,只要它们仍然是某种可点击的链接并且它们可以移动
-
我发布了一个解决方案,如果您正在寻找,请告诉我。
标签: javascript jquery draggable jquery-ui-droppable jquery-ui-sortable