Если я понимаю ваш вопрос и ваше желаемое поведение:
Перемещение одного или нескольких выбранных элементов, выбор выполняется с помощью мыши, а перемещение выполняется нажатием клавиш, вверх, вниз, влево и вправо.
Я думаю, что у вас это в значительной степени есть, единственное, что ваш выбор никогда не очищается, что должно происходить, когда любой щелчок происходит после того, как был сделан ход.
Вы можете рассмотреть возможность моделирования поведения в режимы.
Где поведение, выполненное в псевдокоде, будет примерно таким:
let mode = 0; // selection mode
let selections = [];
... key press event Listeners
... click event Listeners
function processAction( action, event ) {
If ( 'click' == action && 0 != mode ){ // was in move mode
mode = 0; // Set to selection mode.
selections = []; // resets the selections made
... // reset DOM, and clear any currently decorated elements
}
if ( 'click' == action) {
selections.push(event.targetElement);
...// Update DOM and decorate elements
}
If ( 'move' === action && mode !== 1) {
mode = 1; // This enters us into "Move" mode.
}
If ( 'move' === action ){
// Execute moving logic
}
}
Чтобы решить проблему с двойным щелчком.
Или, если я дважды щелкну тот же элемент, он вернется в исходное положение
Это результат определенного «стандартного» поведения или «предустановок» вашего браузера в отношении того, как он ведет себя, когда пользователь перетаскивает элемент. Вы можете отключить это «стандартное» поведение двумя способами, один из них - с небольшим CSS
.list-item {
-webkit-user-drag: none;
-khtml-user-drag: none;
-moz-user-drag: none;
-o-user-drag: none;
user-drag: none;
}
. Подробнее об этом «стандартном» поведении на MDN можно узнать здесь , которое гласит :
Если этот атрибут не установлен, его значение по умолчанию - auto, что означает, что поведение перетаскивания является поведением браузера по умолчанию: можно перетаскивать только выделенный текст, изображения и ссылки ...
О, и я забыл упомянуть, вы можете просто прикрепить слушателей событий к элементу id="list"
, так как события щелчка всех дочерних элементов будут всплывать и перехватываться.
Вы можете найти подробную информацию о том, как чтобы выяснить, какой элемент был нажат здесь и больше о том, как всплывают события здесь и на MDN здесь , в частности, в разделе «Объяснение всплывания и захвата»
PS: Я также видел в некоторых приложениях, где у них аналогичное поведение, выбор выполняется с помощью мыши и перемещается с помощью клавиш со стрелками. Они позволяют пользователю перемещаться на другое расстояние, когда клавиша «Shift» удерживается нажатой при нажатии клавиши со стрелкой.