Задать вопрос
@ForSureN1
frontend dev

Как можно менять у элемента атрибут приоритета при drag'n'drop?

Добрый день, есть реализованный drag'n'drop с блокам в колонку, у каждого имеется свой приоритет, и нужно сделать так, чтобы при перетаскивании, приоритет становился соответствующих у элемента, то есть перетащив элемент с 10 приоритет на 4, у него становился 4 и у остальных блоков происходил инкремент, заранее благодарю, вот песочница.
https://codepen.io/forsuren1/pen/mdMrvjP
Так же сам код
<body>
    <div class="box">
        <div class="item" draggable="true" data-priority="1">1</div>
        <div class="item" draggable="true" data-priority="2">2</div>
        <div class="item" draggable="true" data-priority="3">3</div>
        <div class="item" draggable="true" data-priority="4">4</div>
        <div class="item" draggable="true" data-priority="5">5</div>
        <div class="item" draggable="true" data-priority="6">6</div>
        <div class="item" draggable="true" data-priority="7">7</div>
        <div class="item" draggable="true" data-priority="8">8</div>
        <div class="item" draggable="true" data-priority="9">9</div>
        <div class="item" draggable="true" data-priority="10">10</div>
    </div>
    <script src="js.js"></script>
</body>

let box = document.querySelector('.box')
let items = document.querySelectorAll('.item')

items.forEach(item => {
    item.addEventListener('dragstart', () => {
        item.classList.add('dragging')
    })
    item.addEventListener('dragend', () => {
        item.classList.remove('dragging')
        box.classList.add('preload')
        setTimeout(() => { box.classList.remove('preload') }, 1000)
        console.log(item.getAttribute('data-priority'))
    })
})

box.addEventListener('dragover', e => {
    e.preventDefault();
    const afterElement = getDragAfterElement(box, e.clientY)
    const draggable = document.querySelector('.dragging')
        // console.log(afterElement)
    if (afterElement == null) {
        box.appendChild(draggable)
    } else {
        box.insertBefore(draggable, afterElement)
    }
})


function getDragAfterElement(box, y) {
    const draggableElements = [...box.querySelectorAll('.item:not(.dragging)')]

    return draggableElements.reduce((closest, child) => {
        const container = child.getBoundingClientRect()
        const offset = y - container.top - container.height / 2
        if (offset < 0 && offset > closest.offset) {
            return { offset: offset, element: child }
        } else {
            return closest
        }
    }, { offset: Number.NEGATIVE_INFINITY }).element;
}
  • Вопрос задан
  • 68 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Добавить в обработчик dragend:

document.querySelectorAll('.item').forEach((n, i) => n.dataset.priority = ++i);

// или

for (const [ i, n ] of document.querySelectorAll('.item').entries()) {
  n.setAttribute('data-priority', i + 1);
}

// или

const items = document.getElementsByClassName('item');
for (let i = 0; i < items.length; i++) {
  items[i].attributes['data-priority'].value = -~i;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы