Я использую jQuery draggables / droppables, связанные с событием наведения мыши live (). Я использую live, потому что я использую load () для загрузки страницы, и мне нужны эти элементы, доступные после загрузки. В Firefox и Safari я получаю странное поведение, когда при первоначальной загрузке страницы работают только некоторые области, которые можно удалить. Но, отпустив перетаскиваемый div, а затем повторно выбрав его, они снова волшебным образом работают. Перетаскивание div перетаскивания из странных мест иногда работает. Также при первоначальной загрузке все сбрасываемые области будут работать, но некоторые из них только после того, как изначально «дотронулись». Эти первоначальные активирующие прикосновения часто не прямо над div, но иногда далеко от браузера. В любом случае, вот мой код:
$(document).ready(function() {
// Load main report object
function reload_report() {
$('#report').load('{% url timetracker.views.project_report report_id=report_meta.id %}');
}
reload_report();
// Binding dragging events
$('.worklog-row').live('mouseover', function () {
drag_worklogs(this);
return false;
});
// Binding dropping events
$('.dropTarget').live('mouseover', function () {
drop_worklogs(this, '{% url timetracker.views.move_worklogs report_id=report_meta.id %}', 'drop-hover', reload_report);
});
Затем в связанном файле JS:
function drop_worklogs($this, post_url, hover_class, callback) {
$($this).droppable({
tolerance: 'pointer',
hoverClass: hover_class,
drop: function(event, ui) {
// Get ids of dropped worklogs
var worklogs = [];
ui.helper.children().each(function() {
var id = this.id;
id = id.split('-')[1];
worklogs.push(id);
});
var groupStr = $($this).attr('id');
var typeStr;
typeStr = groupStr.split('-')[0];
groupStr = groupStr.split('-')[1];
var requestArr = {
worklogs: worklogs,
group: groupStr,
type: typeStr
};
var requestData = JSON.stringify(requestArr);
//alert(requestData);
// Send to server via POST request
var success = false;
$.post(post_url, { move: requestData }, function() {}, "json");
callback();
}
});
}
function drag_worklogs($this) {
// Drag and drop
$($this).draggable({
helper:function() {
var selected = $('input:checked').parents('tr');
if (selected.length === 0) {
selected = $($this);
}
var container = $('<div/>').attr('id', 'draggingContainer');
container.append(selected.clone());
return container;
}
});