Pulling It All Together 最後我們擁有了所有的 drag/drop 的腳本片斷!下一個事情是我們將創建一個 DOM 處理。如果你不是很熟悉,請先閱讀我的
JavaScript Primer on DOM Manipulation。
下面的代碼將創建 container(容器),而且使任何一個需要 drag/dro p的 item 變成一個容器的 item。代碼在這個文章第二個 demo 的後面,它可以用戶記錄一個 list(清單),定為一個導航窗口在左邊或者右邊,或者更多的函數你可以想到的。
下一步我們將透過 "假代碼" 讓 reader 看到真代碼,下面為推薦︰
1、當document第一次載入時,創建 dragHelper DIV.dragHelper 將給移動的 item 加陰影。真實的 item 沒有被 dragged,只是用了 insertBefor 和 appendChild 來移動了,我們隱藏了 dragHelper。
2、有了 mouseDown 與 mouseUp 函數。所有的操作會對應到當到 iMouseDown 的狀態中,只有當 mouse 左鍵為按下時 iMouseDown 才為真,否則為假。
3、我們創建了全局變量 DragDrops 與全局函數 CreateDragContainer.DragDrops 包含了一系列相對彼此的容器。任何參數 (containers) 將透過 CreatedcragContainer 進行重組與序列化,這樣可以自由的移動。CreateDragContainer 函數也將 item 進行綁定與設定屬性。
4、現在我們的代碼知道每個 item 的加入,當我們移動處 mouseMove,mouseMove 函數首先會設定變量 target,滑鼠移動在上面的 item,如果這個 item 在容器中 (checked with getAttribute)︰
* 運行一小段代碼來改變目標的樣式。創造 rollover 效果。
* 檢查滑鼠是否沒有放開,如果沒有︰
o 設定 curTarget 代表目前 item。
o 記錄 item 的目前位置,如果需要的話,我們可以將它返回。
o 克隆目前的 item 到 dragHelper 中,我們可以移動帶陰影效果的 item。
o item 拷貝到 dragHelper 後,原有的 item 還在滑鼠指針下,我們必須刪除掉 dragObj,這樣腳本起作用,dragObj 被包含在一個容器中。
o 抓取容器中所有的 item 目前坐標,高度/寬度,這樣隻需要記錄一次,當 item 被 drag 時,每隨 mouse 移動,每移鐘就會記錄成千上萬次。
* 如果沒有,不需要做任何事,因為這不是一個需要移動的 item。
5、檢查 curTarget,它應該包含一個被移動的 item,如果存在,進行下面操作:
* 開始移動帶有陰影的 item,這個 item 就是前文所創建的。
* 檢查每個目前容器中的container,是否滑鼠已經移動到這些範圍內了。
o 我們檢查看一下正在拖曳的 item 是屬於哪個 container。
o 放置 item 在一個 container 的某一個 item 之前,或者整個 container 之後。
o 確認 item 是可見的。
* 如果滑鼠不在 container 中,確認 item 是不可見了。
6、剩下的事就是捕捉 mouseUp 的事件了。
實現一個拖曳的全代碼: 你現在擁有了拖拽的所有東西。
下面的三個 demo 是記錄事件歷史。當你的滑鼠在 item 上移動,將記錄所生的事件,如果你不明白可以嘗試一下滑鼠的劃過或者拖曳,看有什麼發生。
觀看範例。
用 JavaScript 實現滑鼠拖拽網頁表單 ﹙一﹚。
用 JavaScript 實現滑鼠拖拽網頁表單 ﹙二﹚。
用 JavaScript 實現滑鼠拖拽網頁表單 ﹙三﹚。
用 JavaScript 實現滑鼠拖拽網頁表單 ﹙四﹚