У меня есть экземпляр dropzone.js на веб-странице со следующими параметрами:
autoProcessQueue:false
uploadMultiple:true
parallelUploads:20
maxFiles:20
Он создается программно, поскольку является частью более крупной формы. Я настроил его для обработки очереди при отправке формы.
Цель состоит в том, чтобы мои пользователи могли использовать dropzone для управления изображениями для элемента, поэтому я бы хотел, чтобы они могли изменять порядок изображений, перетаскивая предварительные просмотры изображений dropzone.js. Есть хороший способ сделать это? Я пробовал использовать jquery-ui sortable, но, похоже, он не очень хорошо работает с dropzone.js.
4 ответа
Теперь у меня он работает, используя jquery-ui sortable. Хитрость заключалась в том, чтобы обязательно использовать опцию 'items' в sortable, чтобы выбрать только элементы dz-preview, потому что dropzone.js имеет элемент dz-message вместе с элементами dz-preview в основном контейнере. Вот как выглядит мой код:
HTML:
<div id="image-dropzone" class="dropzone square">
Сценарий:
$(function() {
$("#image-dropzone").sortable({
items:'.dz-preview',
cursor: 'move',
opacity: 0.5,
containment: '#image-dropzone',
distance: 20,
tolerance: 'pointer'
});
})
Помимо кода из ралбатросса вам нужно будет установить порядок файловой очереди dropzone ..
Что-то типа:
$("#uploadzone").sortable({
items: '.dz-preview',
cursor: 'move',
opacity: 0.5,
containment: '#uploadzone',
distance: 20,
tolerance: 'pointer',
stop: function () {
var queue = uploadzone.files;
$('#uploadzone .dz-preview .dz-filename [data-dz-name]').each(function (count, el) {
var name = el.getAttribute('data-name');
queue.forEach(function(file) {
if (file.name === name) {
newQueue.push(file);
}
});
});
uploadzone.files = newQueue;
}
});
И помните, что файл обрабатывается асинхронно, я сохраняю хеш-таблицу для справки, когда файл будет готов, и сохраняю порядок в конце.
Не работает с повторяющимися именами файлов
var name = el.innerHTML;
вместо var name = el.getAttribute('data-name');
.
newQueue
перед попыткой передать ему что-либо: var queue = uploadzone.files, newQueue = [];
Вы можете использовать SortableJS (https://github.com/SortableJS/Sortable)
new Sortable(document.getElementById('dropzone'), {
draggable: '.dz-preview'
})
Вот еще один вариант без каких-либо плагинов. В обратном вызове успешного события вы можете выполнить некоторую ручную сортировку:
var rows = $('#dropzoneForm').children('.dz-image-preview').get();
rows.sort(function (row1, row2) {
var Row1 = $(row1).children('.preview').find('img').attr('alt');
var Row2 = $(row2).children('.preview').find('img').attr('alt');
if (Row1 < Row2) {
return -1;
}
if (Row1 > Row2) {
return 1;
}
return 0;
});
$.each(rows, function (index, row) {
$('#dropzoneForm').append(row);
});
Похожие вопросы
Связанные вопросы
Новые вопросы
drag-and-drop
Это позволяет вам «захватить» объект с помощью мыши и перетащить его в другое место. Перетаскивание можно выполнить в браузерном приложении (в Интернете) или в приложениях с графическим интерфейсом, таких как Android или на рабочем столе.
$dropzone.sortable({start: function(e, ui) { $dropzone.removeClass('dz-clickable'); ui.item.removeClass('dz-success') }, stop: function() $dropzone.addClass('dz-clickable') }, update: function(e, ui) { console.log('Item reordered!', ui.item); }
— удалить dz-clickable, чтобы отключить диалог открытия файла после перетаскивания. удалить dz-success, потому что анимация воспроизводится каждый раз после перетаскивания. Также у меня была проблема с исчезновением элемента при перетаскивании — была ошибка в jquery-ui sortable.js — заменилthis.document[0]
наthis.document[0].body
в строке 1008.