1. 程式人生 > >dragstart drag dragend dragenter dragover dragleave drop dragstart drag dragend dragenter dragover dragleave drop

dragstart drag dragend dragenter dragover dragleave drop dragstart drag dragend dragenter dragover dragleave drop

dragstart drag dragend dragenter dragover dragleave drop

 

前端框架層出不窮,網頁上的效果越來越絢麗,製作絢麗的效果的成本越來越低,其中有種拖拽的效果是十分常見並且實用的。

其實手機上的使用已經非常頻繁,舉個例子,用手指選中一張圖片,然後將圖片拖到回收站,這就是一個完整的拖拽過程。細分一下,大致可以分為如下幾個步驟:

首先,選中目標;然後拖動目標;最後在指定區域釋放目標。

在javascript中有專門為這個過程設定的事件, 如果這種方式能夠得到普及的話(相容性問題不大,IE都相容),就可以替換到老舊的修改元素位置的方式實現拖動的方式。這樣做顯而易見的好處就是,老方法一般需要將元素設定為絕對定位(absolute)然後將滑鼠的偏移同步到被拖放元素;其次,老方法需要使用javascript高密度的修改DOM,效率低。

 

拖動過程需要從兩個角度分解這個動作,可以想象這麼一個場景,我們在地上劃出一個範圍,需要將桌子擡進去。

對於被拖動的桌子,需要拽住桌子,然後拖動,最後放下,在javascript對應的就是dragstart/drag/dragend(如果直接作為屬性寫,需要在開頭加一個on);對於目標區域來說,桌子有個進入區域的狀態,然後停留在上方的過程,最後是放到上面的狀態,那對應的是dragenter/dragover/drop,當然,如果桌子擡進去,在沒放下的情況下又擡出來,那會觸發“擡離”的事件--dragleave。 拖動過程中,dragenter/dragover/dragleave/drop會發生在拖動軌跡經過的任意元素身上。當然,假設目標區域是元素B,被拖動的是元素A,那麼給B繫結的事件,只有A被拖入B的時候才會執行(fire/dispatch)。當然,大部分高階瀏覽器都會對圖片或者連結的dragend時刻有興趣。

如果不希望在拖動網頁上的圖片時,瀏覽器預設開啟新視窗的話,需要對dragstart開刀,通過在dragstart事件函式中return false,就可以達到這一目的。

拖動過程中,拖動的內容是什麼,我們也許會感興趣,那麼dataTransfer顯得尤為重要(將檔案直接從電腦的檔案系統中拽到瀏覽器中也可以通過它實現)。

 

http://help.dottoro.com/external/examples/ljpncnwi/ondragstart_3.htm 這個demo可以將流程看的較為清晰。

文中的被拖動元素是指source element, 目標區域是指target element,不準確,可以適當轉換一下。

ondragstart:

執行拖動操作時候,發生在被拖動的元素(或者一段文字)上,也是最拖動過程中第一個觸發的事件。

如果一些文字被選中,可以通過拖拽選中區域,在目標區域鬆手就可以;預設情況下,目標區域可以是一個可編輯元素(textarea/input),處於可編輯模式下的元素/an element in editable mode---<div contenteditable="true">,或者是設計模式下的文件/document in design mode。關於contentEditable和design mode的區別,可以參考這裡。

ondrag:

被拖動元素在拖動期間會定時的觸發這一事件,即使沒有移到目標區域。

ondragend:

被拖動元素被“放下”的時候發生在其身上的事件。

ondragenter:

這是目標區域(元素)dragover的開端,只有滑鼠移入了,才會有懸浮的事件dragover。

ondragover:

和ondrag有點類似,也是高頻率觸發的事件,但是發生在目標區域,且發生在dragenter之後,dragleave之前。

ondragleave:

和ondragenter剛好相反,結束dragover。

ondrop:

被拖動元素被“放置”在目標區域的時候,也就是拖拽結束的時候,發生在目標區域的事件。

 

在實踐的過程中,發現在Chrome中,如果img沒有src或者src無效的情況下,不會觸發拖拽事件的。暫時還未找到相關文件。求真相

前端框架層出不窮,網頁上的效果越來越絢麗,製作絢麗的效果的成本越來越低,其中有種拖拽的效果是十分常見並且實用的。

其實手機上的使用已經非常頻繁,舉個例子,用手指選中一張圖片,然後將圖片拖到回收站,這就是一個完整的拖拽過程。細分一下,大致可以分為如下幾個步驟:

首先,選中目標;然後拖動目標;最後在指定區域釋放目標。

在javascript中有專門為這個過程設定的事件, 如果這種方式能夠得到普及的話(相容性問題不大,IE都相容),就可以替換到老舊的修改元素位置的方式實現拖動的方式。這樣做顯而易見的好處就是,老方法一般需要將元素設定為絕對定位(absolute)然後將滑鼠的偏移同步到被拖放元素;其次,老方法需要使用javascript高密度的修改DOM,效率低。

 

拖動過程需要從兩個角度分解這個動作,可以想象這麼一個場景,我們在地上劃出一個範圍,需要將桌子擡進去。

對於被拖動的桌子,需要拽住桌子,然後拖動,最後放下,在javascript對應的就是dragstart/drag/dragend(如果直接作為屬性寫,需要在開頭加一個on);對於目標區域來說,桌子有個進入區域的狀態,然後停留在上方的過程,最後是放到上面的狀態,那對應的是dragenter/dragover/drop,當然,如果桌子擡進去,在沒放下的情況下又擡出來,那會觸發“擡離”的事件--dragleave。 拖動過程中,dragenter/dragover/dragleave/drop會發生在拖動軌跡經過的任意元素身上。當然,假設目標區域是元素B,被拖動的是元素A,那麼給B繫結的事件,只有A被拖入B的時候才會執行(fire/dispatch)。當然,大部分高階瀏覽器都會對圖片或者連結的dragend時刻有興趣。

如果不希望在拖動網頁上的圖片時,瀏覽器預設開啟新視窗的話,需要對dragstart開刀,通過在dragstart事件函式中return false,就可以達到這一目的。

拖動過程中,拖動的內容是什麼,我們也許會感興趣,那麼dataTransfer顯得尤為重要(將檔案直接從電腦的檔案系統中拽到瀏覽器中也可以通過它實現)。

 

http://help.dottoro.com/external/examples/ljpncnwi/ondragstart_3.htm 這個demo可以將流程看的較為清晰。

文中的被拖動元素是指source element, 目標區域是指target element,不準確,可以適當轉換一下。

ondragstart:

執行拖動操作時候,發生在被拖動的元素(或者一段文字)上,也是最拖動過程中第一個觸發的事件。

如果一些文字被選中,可以通過拖拽選中區域,在目標區域鬆手就可以;預設情況下,目標區域可以是一個可編輯元素(textarea/input),處於可編輯模式下的元素/an element in editable mode---<div contenteditable="true">,或者是設計模式下的文件/document in design mode。關於contentEditable和design mode的區別,可以參考這裡。

ondrag:

被拖動元素在拖動期間會定時的觸發這一事件,即使沒有移到目標區域。

ondragend:

被拖動元素被“放下”的時候發生在其身上的事件。

ondragenter:

這是目標區域(元素)dragover的開端,只有滑鼠移入了,才會有懸浮的事件dragover。

ondragover:

和ondrag有點類似,也是高頻率觸發的事件,但是發生在目標區域,且發生在dragenter之後,dragleave之前。

ondragleave:

和ondragenter剛好相反,結束dragover。

ondrop:

被拖動元素被“放置”在目標區域的時候,也就是拖拽結束的時候,發生在目標區域的事件。

 

在實踐的過程中,發現在Chrome中,如果img沒有src或者src無效的情況下,不會觸發拖拽事件的。暫時還未找到相關文件。求真相