HTML의 드래그 앤 드롭

Adobe AIR 1.0 이상

HTML 기반 응용 프로그램 내부로 또는 외부로(또는 HTMLLoader에 표시된 HTML 내부로 또는 외부로) 데이터를 드래그할 경우 HTML 끌어 놓기 이벤트를 사용할 수 있습니다. HTML 끌어 놓기 API를 사용하여 HTML 내용의 DOM 요소 내부로 또는 외부로 드래그할 수 있습니다.

참고: 또한 HTML 내용이 포함된 HTMLLoader 객체에서 이벤트를 청취함으로써 AIR NativeDragEvent 및 NativeDragManager API를 사용할 수도 있습니다. 그러나 HTML API가 HTML DOM과 더 잘 통합되며 기본 비헤이비어를 제어할 수 있습니다.

기본 끌어 놓기 비헤이비어

HTML 환경은 텍스트, 이미지 및 URL과 관련된 드래그 앤 드롭 동작의 기본 비헤이비어를 제공합니다. 기본 비헤이비어를 사용하여 요소로부터 항상 이러한 유형의 데이터를 드래그할 수 있습니다. 그러나 텍스트만 요소로 드래그할 수 있으며, 페이지의 편집 가능 영역의 요소로만 드래그할 수 있습니다. 페이지의 편집 가능 영역 간에 또는 편집 가능 영역 내에서 텍스트를 드래그할 때 기본 비헤이비어는 이동 작업을 수행합니다. 편집 불가능 영역 또는 응용 프로그램 외부에서 편집 가능 영역으로 텍스트를 드래그할 때 기본 비헤이비어는 복사 작업을 수행합니다.

직접 끌어 놓기 이벤트를 처리하여 기본 비헤이비어를 재정의할 수 있습니다. 기본 비헤이비어를 취소하려면 끌어 놓기 이벤트를 위해 전달된 객체의 preventDefault() 메서드를 호출해야 합니다. 그런 다음 드롭 대상에 데이터를 삽입하고 필요에 따라 드래그 소스에서 데이터를 제거하여 선택한 작업을 수행합니다.

기본적으로 사용자는 어떤 텍스트든 선택 및 드래그할 수 있으며 이미지 및 링크도 드래그할 수 있습니다. WebKit CSS 속성인 -webkit-user-select를 사용하여 HTML 요소를 선택하는 방법을 제어할 수 있습니다. 예를 들어 -webkit-user-selectnone으로 설정할 경우 요소 내용을 선택할 수 없으며 따라서 드래그할 수도 없습니다. 또한 -webkit-user-drag CSS 속성을 사용하여 요소 전체를 드래그할 수 있는지 여부를 제어할 수 있습니다. 그러나 요소의 내용은 별도로 처리됩니다. 텍스트의 일부만 선택하여 드래그할 수도 있습니다. 자세한 내용은 AIR에서의 CSS을 참조하십시오.

HTML에서의 끌어 놓기 이벤트

드래그가 시작되는 시작자 요소에 의해 전달되는 이벤트는 다음과 같습니다.

이벤트

설명

dragstart

사용자가 드래그 동작을 시작할 때 전달됩니다. 이 이벤트의 핸들러는 필요에 따라 이벤트 객체의 preventDefault() 메서드를 호출함으로써 드래그를 방지할 수 있습니다. 드래그된 데이터를 복사, 링크 또는 이동할 수 있는지 여부를 제어하려면 effectAllowed 속성을 설정합니다. 선택된 텍스트, 이미지 및 링크는 기본 동작에 의해 클립보드에 놓이지만 이벤트 객체의 dataTransfer 속성을 사용하여 드래그 동작에 다른 데이터를 설정할 수 있습니다.

drag

드래그 동작 중에 연속적으로 전달됩니다.

dragend

사용자가 드래그 동작을 끝내기 위해 마우스 버튼을 놓으면 전달됩니다.

드래그 대상에 의해 전달되는 이벤트는 다음과 같습니다.

이벤트

설명

dragover

요소 경계 내에서 드래그 동작이 남아 있는 동안 지속적으로 전달됩니다. 이 이벤트의 핸들러는 사용자가 마우스 버튼을 놓을 경우 드롭 결과 복사, 이동 또는 링크 작업이 발생하는지 여부를 나타내기 위해 dataTransfer.dropEffect 속성을 설정해야 합니다.

dragenter

드래그 동작이 요소의 경계에 진입할 때 전달됩니다.

dragenter 이벤트 핸들러의 dataTransfer 객체의 속성을 변경할 경우 해당 변경 사항이 다음 dragover 이벤트에 의해 신속하게 재정의됩니다. 한편 dragenter와 첫 번째 dragover 이벤트 사이에는 짧은 지연이 있어서 서로 다른 속성이 설정되어 있는 경우 커서가 깜박거릴 수 있습니다. 많은 경우 두 가지 이벤트에 동일한 이벤트 핸들러를 사용할 수 있습니다.

dragleave

드래그 동작이 요소 경계를 떠날 때 전달됩니다.

drop

사용자가 데이터를 요소 위에 드롭할 때 전달됩니다. 드래그되는 데이터는 이 이벤트의 핸들러 내에서만 액세스할 수 있습니다.

이들 이벤트에 대한 응답으로 전달되는 이벤트 객체는 마우스 이벤트와 유사합니다. (clientX, clientY) 및 (screenX, screenY)와 같은 마우스 이벤트 속성을 사용하여 마우스 위치를 판별할 수 있습니다.

드래그 이벤트 객체의 가장 중요한 속성은 드래그되는 데이터가 포함되는 dataTransfer입니다. dataTransfer 객체에는 다음과 같은 속성 및 메서드가 들어 있습니다.

속성 또는 메서드

설명

effectAllowed

드래그 소스에서 허용되는 효과입니다. 일반적으로 dragstart 이벤트의 핸들러가 이 값을 설정합니다. HTML에서의 드래그 효과를 참조하십시오.

dropEffect

대상 또는 사용자가 선택한 효과입니다. dragover 또는 dragenter 이벤트 핸들러에서 dropEffect를 설정할 경우 AIR은 사용자가 마우스를 놓았을 때 발생하는 효과를 나타내도록 마우스 커서를 업데이트합니다. dropEffect 집합이 허용되는 효과 중 일치하지 않는 효과가 있을 경우 드롭이 허용되지 않으며 사용 불가 커서가 표시됩니다. 최근의 dragover 또는 dragenter 이벤트에 대한 응답으로 dropEffect를 설정하지 않은 경우 사용자는 표준 운영 체제 수정자 키를 사용하여 허용되는 효과에서 선택할 수 있습니다.

최종적인 효과는 dragend에 대해 전달된 객체의 dropEffect 속성에 의해 보고됩니다. 유효한 대상 외부에서 마우스 버튼을 놓음으로써 드롭 동작을 중단할 경우 dropEffectnone으로 설정됩니다.

types

각 데이터 포맷에 대한 MIME 유형 문자열이 들어 있는 배열이 dataTransfer 객체에 들어 있습니다.

getData(mimeType)

mimeType 매개 변수로 지정한 포맷의 데이터를 가져옵니다.

getData() 메서드는 drop 이벤트에 대한 응답으로만 호출할 수 있습니다.

setData(mimeType)

데이터를 mimeType 매개 변수로 지정한 포맷으로 dataTransfer에 추가합니다. 각 MIME 유형에 대해 setData()를 호출함으로써 여러 포맷의 데이터를 추가할 수 있습니다. 기본 드래그 비헤이비어에 의해 dataTransfer 객체에 위치한 모든 데이터는 제거됩니다.

setData() 메서드는 dragstart 이벤트에 대한 응답으로만 호출할 수 있습니다.

clearData(mimeType)

mimeType 매개 변수로 지정한 포맷의 모든 데이터를 제거합니다.

setDragImage(image, offsetX, offsetY)

사용자 정의 드래그 이미지를 설정합니다. setDragImage() 메서드는 dragstart 이벤트에 대한 응답으로만, 그리고 HTML 요소의 -webkit-user-drag CSS 스타일을 element로 설정하여 전체 HTML 요소가 드래그되는 경우에만 호출할 수 있습니다. image 매개 변수는 JavaScript 요소 또는 Image 객체일 수 있습니다.

HTML 끌어 놓기를 위한 MIME 유형

HTML 끌어 놓기 이벤트의 dataTransfer 객체와 함께 사용할 수 있는 MIME 유형은 다음과 같습니다.

데이터 포맷

MIME 유형

텍스트

"text/plain"

HTML

"text/html"

URL

"text/uri-list"

비트맵

"image/x-vnd.adobe.air.bitmap"

파일 목록

"application/x-vnd.adobe.air.file-list"

응용 프로그램에서 정의한 문자열을 포함하여 기타 MIME 문자열도 사용할 수 있습니다. 그러나 다른 응용 프로그램에서 전송된 데이터를 인식하지 못하거나 사용하지 못할 수 있습니다. 데이터를 해당 포맷으로 dataTransfer 객체에 추가하는 것은 사용자가 해야 합니다.

중요: 응용 프로그램 샌드박스에서 실행되는 코드만 드롭된 파일에 액세스할 수 있습니다. 비 응용 프로그램 샌드박스 내의 File 객체 속성을 읽거나 설정하려 할 경우 보안 오류가 발생합니다. 자세한 내용은 비 응용 프로그램 HTML 샌드박스에서 파일 드롭 처리를 참조하십시오.

HTML에서의 드래그 효과

드래그 동작의 시작자는 dragstart 이벤트의 핸들러에서 dataTransfer.effectAllowed 속성을 설정하여 허용되는 드래그 효과를 제한할 수 있습니다. 다음과 같은 문자열 값이 사용될 수 있습니다.

문자열 값

설명

"none"

드래그 조작이 허용되지 않습니다.

"copy"

원본을 그 자리에 둔 상태에서 데이터가 목적지로 복사됩니다.

"link"

데이터가 원본과의 링크를 사용하여 드롭 목적지와 공유됩니다.

"move”

데이터가 목적지로 복사되고 원본 위치에서 제거됩니다.

"copyLink"

데이터가 복사 또는 연결될 수 있습니다.

"copyMove"

데이터가 복사 또는 이동될 수 있습니다.

"linkMove"

데이터가 연결 또는 이동될 수 있습니다.

"all"

데이터가 복사, 이동 또는 연결될 수 있습니다. All은 기본 비헤이비어를 차단할 때의 기본 효과입니다.

드래그 동작의 대상은 dataTransfer.dropEffect 속성을 설정하여 사용자가 드롭을 완료할 경우 수행할 작업을 나타냅니다. 드롭 효과가 허용되는 작업 중 하나인 경우 시스템은 적절한 복사, 이동 또는 연결 커서를 표시합니다. 그렇지 않은 경우 시스템은 사용 불가 커서를 표시합니다. 대상이 드롭 효과를 설정하지 않은 경우 사용자는 수정자 키를 사용하여 허용되는 작업 중에서 선택할 수 있습니다.

dragoverdragenter 이벤트에 대한 핸들러에서 dropEffect 값을 설정합니다.

function doDragStart(event) { 
    event.dataTransfer.setData("text/plain","Text to drag"); 
    event.dataTransfer.effectAllowed = "copyMove"; 
} 
 
function doDragOver(event) { 
    event.dataTransfer.dropEffect = "copy"; 
} 
 
function doDragEnter(event) { 
    event.dataTransfer.dropEffect = "copy"; 
}
참고: dragenter에 대한 핸들러에서 항상 dropEffect 속성을 설정해야 하지만 다음 dragover 이벤트가 기본값으로 속성을 재설정함을 기억하십시오. 두 가지 이벤트에 대한 응답으로 dropEffect를 설정합니다.