2 回答

TA貢獻1824條經驗 獲得超8個贊
這是我的解決方案,基于 saintvixalien 的幫助。
$(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/

TA貢獻1802條經驗 獲得超10個贊
問題是,當您添加"dragenter dragover drop"事件偵聽器時,只有 2 行,這意味著對于添加的每個新行,您都必須向其中添加事件偵聽器。
注意:如果每次添加新行時都運行事件偵聽過程,您最終會得到具有 2 個或更多事件偵聽器的舊行,這些事件偵聽器性能不佳并且可能導致問題。
一種解決方案是添加具有類的新行,new-row然后將事件偵聽器添加到new-rows,然后刪除new-rowid。
JSFiddle:https ://jsfiddle.net/rcf4qp85/
$(function() {
$('.event').on("dragstart", function(event) {
var dt = event.originalEvent.dataTransfer;
dt.setData('Text', $(this).attr('id'));
});
initnewrows();
$('#addRow').on('click', function() {
$('#targetTable > tbody:last-child').append('<tr class="new-row"><td></td><td></td><td></td></tr>'); initnewrows();
});
});
function initnewrows() {
$('table tr.new-row 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));
}
});
$('table tr.new-row').removeClass('new-row');
}
您還必須將類添加new-row到最初的 presenttrs中。
<table id="targetTable" border="1">
<thead>
<tr class="new-row">
<th>Col 1</th>
<th>Col 2</th>
<th>Col 3</th>
</tr>
</thead>
<tbody>
<tr class="new-row">
<td><span class="event" id="a" draggable="true">Move Me</span></td>
<td></td>
<td></td>
</tr>
<tr class="new-row">
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p><button id='addRow'>Add Row</button></p>
<p>
You can successfully drag the "Move Me" block to any cell in the first two rows.<br/>But add a new row with the "Add Row" button, and you can't drop that block into any new row.
</p>
JSFiddle:https ://jsfiddle.net/rcf4qp85/
添加回答
舉報