我正在使用jQuery UI可拖动功能。完整的代码更复杂,所以我只是创建了一个简单的测试场景来解决这里的错误: Fiddle
有两个部分“top”和“content”。 “顶部”部分有一个黄色按钮,可以拖动。
当我拖动顶部的黄色按钮并将其拖放到灰色的“内容”区域时,它将在灰色内容中显示:
黄盒子1 第1项 第2项 第3项 添加新项目(按钮)
当我点击“添加新项目”按钮时,“项目4”文本将添加到项目3文本下。 当我再次单击“添加新项目”按钮时,“项目5”文本将添加到项目4文本下,依此类推......
按预期工作。但是,当我再次拖动顶部的黄色按钮并将其放在灰色区域时会出现问题,我将会这样:
黄盒子1 第1项 第2项 第3项 第4项 第5项 添加新项目
黄盒子2 第1项 第2项 第3项 添加新项目
所以当我回去并且每次点击黄色方框1下的添加新项目按钮时,它会为每次点击添加两个新项目而不是一个(它将在项目5下添加项目6和项目7)不是我想要的。
我试图取消事件冒泡和其他一些事情,但不知何故它不起作用。当我在不使用jQuery UI可拖动函数的情况下隔离相同的场景时,它的行为与预期一致。所以我猜这个bug与我实现可拖动功能的方式有关。谢谢你的帮助。
以下是代码:
$(function() {
$('#content').sortable({
placeholder: 'ui-state-highlight'
});
$(".top-icon").draggable({
connectToSortable: '#content',
helper: myHelper,
stop: handleDragStop
});
function myHelper(event) {
return $(this).clone();
}
var i = 1;
function handleDragStop(event, ui) {
var current_text = '<div class="color-box"><b>Yellow Box ' + i + '</b>'
+ '<div class="yellow-content">'
+ '<div class="item">Item 1</div>'
+ '<div class="item">Item 2</div>'
+ '<div class="item">Item 3</div>'
+ '<div class="add-item">Add New Item</div>'
+ '</div>'
+ '</div>';
$('#content .top-icon').after(current_text);
i++;
var $new_insert_item = $('#content .top-icon').next();
$('#content .top-icon').remove(); // remove the clone .top-icon inside #content
console.log('hi');
// when click on Add New Item button
$('.color-box').on('click', '.add-item', function() {
var $this = $(this);
var item_count = $this.siblings('.item').length + 1;
console.log (item_count);
var str_item = '';
str_item = '<div class="item">Item ' + item_count + '</div>';
$(str_item).insertBefore($this);
});
}
// end of handleDragStop
});
答案 0 :(得分:2)
问题在于,将handleDragStop
内的click事件绑定到现有已拖动的项目,以便现有的拖动项目在每次拖动期间获得的点击事件加1。因此,请将事件绑定到外部,并将事件绑定到#content
(如果这是在第一次拖动之前存在于DOM中的容器)。
$('#content').on('click', '.add-item', function () {
var $this = $(this);
var item_count = $this.siblings('.item').length + 1;
console.log(item_count);
var str_item = '';
str_item = '<div class="item">Item ' + item_count + '</div>';
$(str_item).insertBefore($this);
});
<强> Fiddle 强>