Untitled
unknown
javascript
3 years ago
6.2 kB
4
Indexable
class FifteenTheGame { empty; allGameRows; allDraggableElements; empty; draggedElement; draggedElementParent; currentRowIndex; allCurrentRowGridItems; currentEmptyIndex; // relative elements allRelativeElements; relativeTop; relativeBottom; relativeLeft; relativeRight; constructor( empty, draggedElement, draggedElementParent, currentRowIndex, allCurrentRowGridItems, currentEmptyIndex, allRelativeElements, relativeTop, relativeBottom, relativeLeft, relativeRight ) { this.empty = empty; this.empty = document.querySelector('.pietnastka-grid__item.empty'); this.draggedElement = draggedElement; this.draggedElementParent = draggedElementParent; this.currentRowIndex = currentRowIndex; this.allCurrentRowGridItems = allCurrentRowGridItems; this.currentEmptyIndex = currentEmptyIndex; // relative elements this.allRelativeElements = allRelativeElements; this.relativeTop = relativeTop; this.relativeBottom = relativeBottom; this.relativeLeft = relativeLeft; this.relativeRight = relativeRight; this.allGameRows = document.querySelectorAll('.pietnastka-grid__row'); this.allDraggableElements = document.querySelectorAll('.pietnastka-grid__number.jsDraggable'); Array.from(this.allDraggableElements).forEach(item => { item.addEventListener('dragstart', this.dragStart); item.addEventListener('dragend', this.dragEnd); }); this.addListenersToEmpty(); } dragStart(event) { event.target.classList.add('hold'); this.draggedElement = event.target; this.draggedElementParent = event.currentTarget.parentElement; setTimeout(() => event.target.classList.add('invisible'), 0); } dragEnd(event) { console.log('event dragend został wywołany!'); event.target.classList.remove('invisible'); } dragOver(event) { event.preventDefault(); } dragEnter(event) { event.preventDefault(); console.log('dragEnter'); event.target.classList.add('hovered'); } removeClassOnDragLeave(event) { event.target.classList.remove('hovered'); } addListenersToEmpty() { this.empty.addEventListener('dragover', this.dragOver); this.empty.addEventListener('dragenter', this.dragEnter); this.empty.addEventListener('dragleave', this.removeClassOnDragLeave); this.empty.addEventListener('drop', this.dropHandler); } removeListenersFromEmpty() { this.empty.removeEventListener('dragover', this.dragOver); this.empty.removeEventListener('dragenter', this.dragEnter); this.empty.removeEventListener('dragleave', this.removeClassOnDragLeave); this.empty.removeEventListener('drop', this.dropHandler); } dropHandler(event) { // 1. usuwana jest klasa 'empty' z elementu pierwotnie zawierającego klasę 'empty' this.empty.classList.remove('empty'); // this.removeListenersFromEmpty(); // 2. dodawana jest klasa empty do rodzica elementu który wywołał wykonanie eventu this.empty = this.draggedElementParent; this.empty.classList.add('empty'); // 2. Z elementów zawieracjących klasę jsDraggable usuwane są EventListener 'dragstart' z pomocą removeEventListener this.allDraggableElements.forEach(item => { item.removeEventListener('dragstart', this.dragStart); }); // 3. Z elementów zawierających klasę jsDraggable usuwana jest klasa jsDraggable i ustawiany jest atrybut draggable na false this.allDraggableElements = document.querySelectorAll('.pietnastka-grid__number.jsDraggable'); this.allDraggableElements.forEach(item => { item.classList.remove('jsDraggable'); item.setAttribute('draggable', false); }); // 4. kalkulowane są elementy do kórych mają być dodane klasy jsDraggable, EventListenery oraz atrybuty draggable=true this.currentRowIndex = Array.from(this.allGameRows).indexOf(this.empty.parentNode); this.allCurrentRowGridItems = this.allGameRows[this.currentRowIndex].querySelectorAll('.pietnastka-grid__item'); this.currentEmptyIndex = Array.from(this.allCurrentRowGridItems).indexOf(this.empty) + 1; this.allRelativeElements = []; this.relativeTop = this.allGameRows[this.currentRowIndex-1] ? this.allGameRows[this.currentRowIndex-1].querySelector('.pietnastka-grid__item:nth-child('+this.currentEmptyIndex+')') : null; this.relativeBottom = this.allGameRows[this.currentRowIndex+1] ? this.allGameRows[this.currentRowIndex+1].querySelector('.pietnastka-grid__item:nth-child('+this.currentEmptyIndex+')') : null; this.relativeLeft = this.allGameRows[this.currentRowIndex].querySelector('.pietnastka-grid__item:nth-child('+(this.currentEmptyIndex-1)+')'); this.relativeRight = this.allGameRows[this.currentRowIndex].querySelector('.pietnastka-grid__item:nth-child('+(this.currentEmptyIndex+1)+')'); this.allRelativeElements = this.allRelativeElements.concat(this.relativeTop,this.relativeBottom,this.relativeLeft,this.relativeRight); event.target.append(this.draggedElement); event.target.classList.remove('hovered'); this.allRelativeElements.forEach(item => { if (item !== null) { item.querySelector('.pietnastka-grid__number').classList.add('jsDraggable'); item.querySelector('.pietnastka-grid__number').addEventListener('dragstart', this.dragStart); item.querySelector('.pietnastka-grid__number').addEventListener('dragend', this.dragEnd); item.querySelector('.pietnastka-grid__number').setAttribute('draggable', true); } }); this.addListenersToEmpty(); } } let startGame = new FifteenTheGame();
Editor is loading...