Я бы посоветовал пользовательский интерфейс, более похожий на этот пример:
https://jqueryui.com/droppable/#photo-manager
Ваш может оказаться более сложным, но это хороший пример того, как вы можете использовать функции DnDв веб-приложении.Учтите, что пользователям потребуется выполнить определенные задачи:
- Переместить выборки в определенное местоположение
- Отрегулировать положение выборов в этом месте
- удалить выборы из местоположения
Кроме того, вы хотите, чтобы они нарезали аудио фрагмент?Сделать его меньше?Отрегулировать другие параметры аудиофайла?
Рассмотрите следующий код.
var buffers = [];
window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.oAudioContext || window.msAudioContext;
if (!AudioContext) {
alert('This site cannot be run in your Browser. Try a recent Chrome or Firefox.');
}
var audioCtx = new AudioContext();
$(function() {
$("#output").sortable({
revert: true,
accept: ".clip",
handle: ".handle",
placeholder: "ui-state-highlight",
receive: function(e, ui) {
var clip = ui.item;
console.log(clip.data("url"));
},
update: function(e, ui) {
if (ui.item.find(".ui-icon-close").length < 1) {
ui.item.append("<span class='ui-icon ui-icon-grip-dotted-vertical handle left'></span>");
ui.item.append("<span class='ui-icon ui-icon-close right'></span>");
$("#output .ui-icon-close").click(function(e) {
$(e.target).parent().remove();
});
}
}
}).disableSelection();
$("#song-clips li").draggable({
helper: "clone",
revert: "invalid",
connectToSortable: "#output"
});
/*
function loadMusic(url, ac) {
var req = $.ajax({
cache: false,
url: url,
responseType: "arraybuffer",
processData: false,
success: function(response) {
ac.decodeAudioData(response,
function(buffer) {
var id = '_' + Math.random().toString(10).substr(2, 9);
buffers[id] = {
buffer: buffer,
start: 1,
to: 5
};
}, onDecodeError);
},
error: function(xhr, error) {
alert('Error during the load. ' + error);
}
});
}
*/
});
body {
font-family: Arial, Helvetica, sans-serif;
}
table {
font-size: 1em;
}
.ui-draggable,
.ui-droppable {
background-position: top;
}
.connectedSortable {
width: 142px;
min-height: 20px;
list-style-type: none;
margin: 0;
padding: 5px 0 0 0;
}
.connectedSortable li {
margin: 0 5px 5px 5px;
padding: 5px;
font-size: 1.2em;
width: 120px;
}
.song-wrapper {
width: 200px;
margin-bottom: 3px;
}
.trash-wrapper {
width: 200px;
float: right;
}
#output {
width: 100%;
height: 48px;
border: 1px solid #eee;
padding: 5px 3px;
overflow-x: scroll;
white-space: nowrap;
}
#output li {
min-height: 20px;
margin: 0;
padding: 5px;
float: left;
width: 120px;
}
#output .ui-icon-close:hover {
background-color: #fff;
border: 1px solid #999;
border-radius: 3px;
}
#output .ui-icon-grip-dotted-vertical {
cursor: move;
}
#output .handle {
margin-top: 3px;
}
.left {
float: left;
}
.right {
float: right;
}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div class="ui-helper-clearfix">
<div class="ui-widget song-wrapper">
<div class="ui-widget-header">Audio Clips</div>
<div class="ui-widget-content">
<ul id="song-clips" class="connectedSortable">
<li class="ui-state-default clip" data-url="https://twgljs.org/examples/sounds/DOCTOR%20VOX%20-%20Level%20Up.mp3">Clip 1</li>
<li class="ui-state-default clip" data-url="https://freesound.org/data/previews/449/449593_7037-lq.mp3">Clip 2</li>
<li class="ui-state-default clip" data-url="https://freesound.org/data/previews/449/449554_2454046-lq.mp3">Clip 3</li>
</ul>
</div>
</div>
</div>
<div class="ui-widget">
<div class="ui-widget-header">Final Output</div>
<div class="ui-widget-content">
<ul id="output" class="connectedSortable">
</ul>
</div>
</div>
Надеюсь, что поможет.