У меня проблемы с перетаскиванием с динамически сгенерированной таблицей. Интерфейс отображает сетку строк и ячеек таблицы на основе выбора пользователя.
Что я хотел бы сделать, это позволить пользователю перетаскивать содержимое одной ячейки, div или span, в другую ячейку.
Этот почти шестилетний разговор go приближается к тому, что я хочу сделать. Но он не справляется со случаем, когда в таблице есть строки, которые добавляются динамически. Перетаскивание содержимого ячейки таблицы
$(function() {
$('.event').on("dragstart", function(event) {
var dt = event.originalEvent.dataTransfer;
dt.setData('Text', $(this).attr('id'));
});
$('table td').on("dragenter dragover drop", function(event) {
event.preventDefault();
if (event.type === 'drop') {
var data = event.originalEvent.dataTransfer.getData('Text', $(this).attr('id'));
de = $('#' + data).detach();
de.appendTo($(this));
};
});
$('#addRow').on('click', function() {
$('#targetTable > tbody:last-child').append('<tr><td></td><td></td><td></td></tr>');
});
});
Этот пример, основанный на этом коде, демонстрирует мою проблему. https://jsfiddle.net/Stormjack/osvu6mea/11/
Вы можете успешно перетащить синий блок в любую ячейку в первых двух строках. Но добавьте новую строку с помощью кнопки «Добавить строку», и вы не сможете поместить этот блок в любую новую строку. Вы все еще можете переместить перетаскиваемый интервал в разные ячейки в первых двух строках. Но его не удается перетащить в новый ряд.
Как мне преодолеть это ограничение? Я счастлив использовать любую комбинацию HTML5 или JavaScript или jQuery или другую клиентскую библиотеку. Спасибо за вашу помощь.
Вот мое решение, основанное на помощи святого.
$(function() {
initDragAndDrop();
$('#addRow').on('click', function() {
$('#targetTable > tbody:last-child').append('<tr><td></td><td></td><td></td></tr>');
clearDragAndDrop();
initDragAndDrop();
});
});
function clearDragAndDrop() {
$('.event').off();
$('table td').off('dragenter dragover drop');
}
function initDragAndDrop() {
$('.event').on('dragstart', function(event) {
var dt = event.originalEvent.dataTransfer;
dt.setData('Text', $(this).attr('id'));
});
$('table td').on('dragenter dragover drop', function(event) {
event.preventDefault();
if (event.type === 'drop') {
var data = event.originalEvent.dataTransfer.getData('Text', $(this).attr('id'));
de = $('#' + data).detach();
de.appendTo($(this));
}
});
}
https://jsfiddle.net/Stormjack/osvu6mea/15/