본문 바로가기

Study/HTML5,CSS,JQuery

[HTML5/CSS3/JQUERY] drag & drop 예제

왼쪽 select 박스와 오른쪽 select 박스의 option들을 서로 이동 시키기

2012.09.10 -> 현재 fire fox에서만 drag & drop이 가능하다.

 

 

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Insert title here</title> 
<!-- <script type="text/javascript" src="js/jquery-1.8.1.min.js"></script> --> 
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script> 
<script type="text/javascript"> 
    /* 2012.09.10 현재 fire fox에서만 실행 가능하다. */ 
    function onDragStart(event) { 
        document.getElementById("msg").innerHTML += "<br/>onDragStart->"; 
        // 드래그 대상 요소(event.target.tagName)가 option일 경우에만 가능토록 한다. 
        // 드래그 대상 요소를 소문자로 바꿔서 option인지 아닌 지 비교 하였다. 
        if (event.target.tagName.toLowerCase() == "option") { 
            // dataTransfer 가 객체에 이동할 요소의 id를 "selectOption"이라는 이름으로 등록한다. 
            // event.target.id -> option태그 안의 select 태그의 id값 
            //alert(event.target.id); 
            event.dataTransfer.setData("selectOption", event.target.id); 
        } else { 
            // 만일 드래그 대상 요소가 option이 아닐 경우 취소한다. 
            event.preventDefault(); 
        } 
    } 
     
    function onDragEnter(event) { 
        document.getElementById("msg").innerHTML += "onDragEnter->"; 
        // 드래그 대상에 selectOption일 경우에만 드롭 가능하도록 설정한다. 
        var types = event.dataTransfer.types; 
        for (var i=0; i<types.length; i++) { 
            if (types[i] == "selectOption") { 
                event.preventDefault(); 
                return; 
            } 
        } 
    } 
     
    function onDragOver(event) { 
        // 특별히 하는 일은 없다. 
        document.getElementById("msg").innerHTML += "onDragOver->"; 
        // 드롭이 가능하도록 기본 상태를 취소한다. 
        event.preventDefault(); 
    } 
     
    function onDrop(event) { 
        document.getElementById("msg").innerHTML += "onDrop"; 
        // dataTransfer 객체로부터 데이터를 꺼내온다. 
        var id = event.dataTransfer.getData("selectOption"); 
        // 현재 문서 객체에서 해당 요소를 가져온다. 
        var optionElement = document.getElementById(id); 
        // 데이터가 존재하고 드래그 이상과 드롭 대상이 같지 않을 경우 실행한다. 
        // optionElement가 null이 아니거나 현재 타겟과 같지 않다면 다음 구문을 실행한다. 
        if (optionElement && optionElement.parentNode != event.currentTarget) { 
            // 드래그 대상에서 이동할 데이터 삭제 
            optionElement.parentNode.removeChild(optionElement); 
            // 드롭 대상에 데이터 추가 
            event.currentTarget.appendChild(optionElement); 
        } 
         
        // 드롭 완료 후 이벤트 버블링을 막기 위해 호출한다. 
        event.stopPropagation(); 
    } 
</script> 
</head> 
<body> 
    <!-- 드래그 대상 요소 --> 
    <select size="4" id="select1" ondragenter="onDragEnter(event)" ondragover="onDragOver(event)" ondrop="onDrop(event)"  ondragstart="onDragStart(event)"> 
        <option id="option1_1" draggable="true">옵션1</option> 
        <option id="option1_2" draggable="true">옵션2</option> 
        <option id="option1_3" draggable="true">옵션3</option> 
    </select> 
     
    <!-- 드롭 대상 요소 --> 
    <select size="4" id="select2" ondragenter="onDragEnter(event)" ondragover="onDragOver(event)" ondrop="onDrop(event)" ondragstart="onDragStart(event)"> 
        <option id="option2_1" draggable="true">옵션2_1</option> 
        <option id="option2_2" draggable="true">옵션2_2</option> 
        <option id="option2_3" draggable="true">옵션2_3</option> 
    </select> 
     
    <br/><br/> 
    <div id="msg"></div> 
</body> 
</html>