我在使用jquery的拖放方面遇到了一些麻烦。我想从每个'ul'中只拖动1个元素。所以我想要的结果是红色框中的“测试”和“foo”。如何跟踪红色框中的元素?
这是代码: http://jsfiddle.net/9edge/CTpTr/
提前thanx
答案 0 :(得分:1)
填写两个单独的计数器,每个项目类型一个(并提供您的项目类以识别它们)。
使用check()函数检查限制,如果达到或不返回true / false,请使用drop()函数更新计数器。
$(function() {
var limit = 1;
var counter_test = 0;
var counter_foo = 0;
$("[id=drag]").draggable({
revert: "invalid"
});
$('#div1').droppable({
accept: function(item) {
if ($(item).hasClass('test')) {
if (counter_test >= limit) {
return false;
}
}
else {
if (counter_foo >= limit) {
return false;
}
}
return true;
},
drop: function(e, ui) {
if (ui.draggable.hasClass('test')) {
counter_test++;
}
else {
counter_foo++;
}
}
});
});
答案 1 :(得分:1)
解决方案的想法:http://jsfiddle.net/CTpTr/23/。你只能放置1个测试元素和1个foo元素,然后你仍然可以拖放,但是droppable元素中不会接受掉落。
答案 2 :(得分:0)
我更新了你的小提琴。 解决方案稍微复杂一点:
如您所见,我从drag
元素中删除了li
个ID。 id应该在网页中是唯一的。
您可以使用选择器另一个选择器(#lists li
)使这些元素可拖动。
然后我使用两个变量来跟踪在红色div中拖放的对象数量。
第一个是“限制”,第二个是“左”。
var limits = { test: 1, foo: 1}, left = 2;
limits
是每个列表中允许的元素数(基于自定义html5 data-dragtype属性),left
是允许的元素总数。
因此,例如,如果您希望能够添加两个类型为“foo”的元素和一个类型为“test”的元素,则可以使用
var limits = { test: 1, foo: 2}, left = 3;
Ore,如果你想允许两个“foo”和一个“test”,但总共有两个元素, 你可以用
var limits = { test: 1, foo: 2}, left = 2;
如您所见,它比您要求的版本更灵活。
每次删除元素时,drop事件处理程序都会使用drg.draggable
检索拖动的元素(请注意函数的参数(e, drg)
),并使用draggable.data('dragtype')
检索其类型。
$(function() {
var limits = { test: 1, foo: 1},
left = 2;
$("#lists li").draggable({
revert: "invalid"
});
$('#div1').droppable({
drop: function(e, drg) {
var draggable = $(drg.draggable),
dragtype = draggable.data('dragtype');
left -=1;
limits[dragtype] -= 1;
if (left == 0) {
$(this).droppable("disable");
$('#lists li').draggable("disable");
}
if (limits[dragtype] == 0){
$('li[data-dragtype=' + dragtype +']').draggable('disable');
}
}
});
});
因此,如果仅针对一种li
达到限制,则可以使用$('li[data-dragtype=' + dragtype +']').draggable('disable')
禁用该类型元素的拖动功能。
需要注意的一件重要事情是添加其他类型的列表是多么容易。例如,如果您要添加“bar”类型的li
元素,则可以添加ul
这样的元素
<ul class="bar">
<li data-dragtype="bar">bar1</li>
<li data-dragtype="bar">bar2</li>
<li data-dragtype="bar">bar3</li>
<li data-dragtype="bar">bar4</li>
</ul>
并相应地设置limits
和left
变量,而不更改drop事件处理程序的代码。例如:
var limits = { test: 1, foo: 1, bar: 2}, left = 4;