若要拖曳資料進出 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-select
設定為
none
時,元素內容即為無法選取的狀態,因此也就無法拖曳。您也可以使用 CSS 屬性
-webkit-user-drag
來控制能否拖曳一整個元素。不過,元素的內容視為各自獨立。使用者仍可拖曳已選取的部分文字。如需詳細資訊,請參閱
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
設定值不符合任何一種允許的效果,則會顯示「不適用」游標形狀且不允許放下項目。若您並未設定
dropEffect
以回應最近發生的
dragover
或
dragenter
事件,使用者即可使用作業系統標準輔助按鍵,從各種允許的效果中選擇。
最終效果是由
dragend
發生時所傳送之物件的
dropEffect
屬性所回報。如果使用者在可行的目標外面放開滑鼠表示放棄放下項目,
dropEffect
即設定為
none
。
|
types
|
包含 MIME 類型字串的陣列,各字串代表存在於
dataTransfer
物件中的每一種資料格式。
|
getData(mimeType)
|
取得由
mimeType
參數所指定之格式的資料。
只有在回應
drop
事件時,才能呼叫
getData()
方法。
|
setData(mimeType)
|
將 mimeType 參數所指定之格式的資料加入
dataTransfer
中。您可以呼叫
setData()
並指定每一種 MIME 類型,藉此加入多種格式的資料。經由預設的拖曳行為放入
dataTransfer
物件中的任何資料都將遭到清除。
只有在回應
dragstart
事件時,才能呼叫
setData()
方法。
|
clearData(mimeType)
|
清除由
mimeType
參數所指定之格式的任何資料。
|
setDragImage(image, offsetX, offsetY)
|
設定自訂的拖曳影像。唯有回應 dragstart 事件,以及因為
-webkit-user-drag
CSS 樣式設定為
element
而拖曳整個 HTML 元素時,才會呼叫
setDragImage()
方法。
image
參數可以是 JavaScript Element 或 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
物件中。
HTML 中的拖曳效果
拖曳手勢的初始程式可以在
dragstart
事件的處理常式中設定
dataTransfer.effectAllowed
屬性,藉此限制所允許的拖曳效果。可用的字串值如下所示:
字串值
|
說明
|
"none"
|
不允許拖曳作業。
|
"copy"
|
資料將會複製到目的端,而原始資料則仍留在原位。
|
"link"
|
透過連結回原始資料的方式,讓放下目標與之共用該份資料。
|
"move"
|
資料將會複製到目的地,並且從原始位置移除。
|
"copyLink"
|
資料可供複製或連結。
|
"copyMove"
|
資料可供複製或移動。
|
"linkMove"
|
資料可供連結或移動。
|
"all"
|
資料可供複製、移動或連結。若已制止預設的行為,預設效果就是
All
。
|
拖曳手勢的目標可以設定
dataTransfer.dropEffect
屬性,指出將在使用者完成放下動作時採取何種動作。如果放下效果屬於任何一種允許的動作,系統就會顯示相應的複製、移動或連結游標形狀。否則,系統將顯示「不適用」游標形狀。如果該目標並未設定任何放下效果,使用者即可利用輔助按鍵從各種允許的效果中選擇。
請一併在
dragover
和
dragenter
事件的處理常式中設定
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
。
|
|
|