서론
Html 드래그 앤 드롭 api는 돔 이벤트 모델에서 정보를 가져와 정보를 업데이트 하는 방식으로 이루어진다. 드래그 앤 드롭을 구현하는데는 여러 방법이 있는데 드래그 된 아이템의 CSS 스타일을 업데이트 할 수도 있고 아니면 드래그 할 아이템을 복사해서 드롭하는 장소에 붙여넣기 할 수도 있다.
구현
먼저 html을 통해 드래그 할 요소와 드롭할 요소를 만들자. draggable='true'
를 추가하여 요소를 드래그 가능하게 만들 수 있다. 처음 알았음
태그 중에 디폴트로 draggable한 요소가 몇가지 있는데 <a>
는 가본적으로 드래그 가능하고, <span>
은 드래그 불가능하다.
<div class='container'>
<span id='draggableOne' draggable='true'>
drag
</span>
<span> dropzone </span>
</div>
드래그 앤 드롭 이벤트 핸들러는 최소 세가지 요소로 구성된다. (전부 함수로 지정된다!!)
ondragstart
: 드래그 된 아이템에 id를 부어하고 드래그 상태에서 일어날 변화들을 지정할 수 있음ondragover
: 드롭 액션을 지정ondrop
: 드롭 행위가 일어난다. 드래그 된 아이템은 DOM을 통해 새로운 부모의 자식이 된다.(이렇게 쓰니까 입양가는 거 같네..)
DataTransfer
함수를 통해서 드래그가 일어나고 있는 동안 돔 이벤트로 부터 데이터를 추적할 수 있다. 이를 사용하기 위해서는 setData
를 통해서 아이디를 지정해 줘야 한다.
function onDragStart(event) {
event
.dataTransfer
.setData('text/plain', event.target.id);
event
.currentTarget
.style
.backgroundColor = 'yellow';
}
html에서
<div class='container'>
<span id='draggableOne' draggable='true' ondragstart='onDragStart(event);'>
drag
</span>
<span> dropzone </span>
</div>
그 다음 ondragover
이벤트를 다음과 같이 지정해준다. 이렇게 하면 브라우저가 드롭 동작을 막는 것을 저지해 드래그 가능한 요소가 dropzone에 도달 가능하다.
<span ondragover='onDragOver(event);'>
dropzone
</span>
function onDragOver(event) {
event.preventDefault();
}
마지막으로 setData
로 얻은 id를 이용해서 getData
가 지정된 id에 있는 데이터를 가져올 수 있도록 한다. 마지막에 datsaTransfer
객체를 리셋해주는 걸 잊지 말자.
<span ondragover='onDragOver(event);' ondrop='onDrop(event);'>
dropzone
</span>
function onDrop(event) {
const id = event
.dataTransfer
.getData('text');
const draggableElement = document.getElementById(id);
const dropzone = event.target;
dropzone.appendChild(draggableElement);
event
.dataTransfer
.clearData();
}
'front-end > javascript' 카테고리의 다른 글
[javascript] ES6 클래스와 Prototype / 왜 Object instanceof Function은 true인가 (4) | 2019.11.09 |
---|---|
[javascript] ES6 export vs NodeJS module.exports와 exports의 차이 (0) | 2019.10.25 |
[Javascript] 자주 사용하는 정규표현식과 공부 사이트 (0) | 2019.09.21 |
[Javascript] ES6, let vs const, 호이스팅과 객체 리터럴, 디스트럭쳐링 (0) | 2019.09.20 |
[javascript] ES6 rest 파라미터와 Spread Syntax(전개 구문) (0) | 2019.09.06 |
댓글