欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

怎么用javascript進(jìn)行拖拽2

 更新時(shí)間:2006年07月20日 00:00:00   作者:  

[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]

你會(huì)注意到這個(gè)代碼幾乎是前面的全集,將前面的合在一起就實(shí)現(xiàn)了拖拽效果了.

當(dāng)我們點(diǎn)擊一個(gè)item時(shí),我們就獲取了很多變量,如鼠標(biāo)位置,鼠標(biāo)位置自然就包含了那個(gè)item的坐標(biāo)信息了.如果我們點(diǎn)擊了一個(gè)20*20px圖像的正中間,那么鼠標(biāo)的相對(duì)坐標(biāo)為{x:10,y:10}.當(dāng)我們點(diǎn)擊這個(gè)圖像的左上角那么鼠標(biāo)的相對(duì)坐標(biāo)為{x:0,y:0}.當(dāng)我們點(diǎn)擊時(shí),我們用這個(gè)方法取得一些鼠標(biāo)與圖片校對(duì)的信息.如果我們不能加載頁面item,那么信息將是document信息,會(huì)忽略了點(diǎn)擊的item信息.

mouseOffset函數(shù)使用了另一個(gè)函數(shù)getPosition.getPosition的作用是返回item相對(duì)頁面左上角的坐標(biāo),如果我們嘗試獲取item.offsetLeft或者item.style.left,那么我們將取得item相對(duì)與父級(jí)的位置,不是整個(gè)document.所有的腳本我們都是相對(duì)整個(gè)document,這樣會(huì)更好一些.

為了完成getPosition任務(wù),必須循環(huán)取得item的父級(jí),我們將加載內(nèi)容到item的左/上的位置.我們需要管理想要的top與left列表.

自從定義了mousemove這個(gè)函數(shù),mouseMove就會(huì)一直運(yùn)行.第一我們確定item的style.position為absolute,第二我們移動(dòng)item到前面定義好的位置.當(dāng)mouse點(diǎn)擊被釋放,dragObject被設(shè)置為null,mouseMove將不在做任何事.

Dropping an Item

前面的例子目的很簡(jiǎn)單,就是拖拽item到我們希望到的地方.我們經(jīng)常還有其他目的如刪除item,比如我們可以將item拖到垃圾桶里,或者其他頁面定義的位置.

很不幸,我們有一個(gè)很大的難題,當(dāng)我們拖拽,item會(huì)在鼠標(biāo)之下,比如mouseove,mousedown,mouseup或者其他mouse action.如果我們拖拽一個(gè)item到垃圾桶上,鼠標(biāo)信息還在item上,不在垃圾桶上.

怎么解決這個(gè)問題呢?有幾個(gè)方法可以來解決.第一,這是以前比較推薦的,我們?cè)谝苿?dòng)鼠標(biāo)時(shí)item會(huì)跟隨鼠標(biāo),并占用了mouseover/mousemove等鼠標(biāo)事件,我們不這樣做,只是讓item跟隨著鼠標(biāo),并不占用mouseover等鼠標(biāo)事件,這樣會(huì)解決問題,但是這樣并不好看,我們還是希望item能直接跟在mouse下.

另一個(gè)選擇是不做item的拖拽.你可以改變鼠標(biāo)指針來顯示需要拖拽的item,然后放在鼠標(biāo)釋放的位置.這個(gè)解決方案,也是因?yàn)槊缹W(xué)原因不予接受.

最后的解決方案是,我們并不去除拖拽效果.這種方法比前兩種繁雜許多,我們需要定義我們需要釋放目標(biāo)的列表,當(dāng)鼠標(biāo)釋放時(shí),手工去檢查釋放的位置是否是在目標(biāo)列表位置上,如果在,說明是釋放在目標(biāo)位置上了.
復(fù)制代碼 代碼如下:

/*
All code from the previous example is needed with the exception
of the mouseUp function which is replaced below
*/

var dropTargets = [];

function addDropTarget(dropTarget){
 dropTargets.push(dropTarget);
}

function mouseUp(ev){
 ev           = ev || window.event;
 var mousePos = mouseCoords(ev);

 for(var i=0; i<dropTargets.length; i++){
  var curTarget  = dropTargets[i];
  var targPos    = getPosition(curTarget);
  var targWidth  = parseInt(curTarget.offsetWidth);
  var targHeight = parseInt(curTarget.offsetHeight);

  if(
   (mousePos.x > targPos.x)                &&

   (mousePos.x < (targPos.x + targWidth))  &&
   (mousePos.y > targPos.y)                &&
   (mousePos.y < (targPos.y + targHeight))){
    // dragObject was dropped onto curTarget!
  }
 }

 dragObject   = null;
}



[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]


鼠標(biāo)釋放時(shí)會(huì)去取是否有drop屬性,如果存在,同時(shí)鼠標(biāo)指針還在drop的范圍內(nèi),執(zhí)行drop操作.我們檢查鼠標(biāo)指針位置是否在目標(biāo)范圍是用(mousePos.x>targetPos.x),而且還要符合條件(mousePos.x<(targPos.x + targWidth)).如果所有的條件符合,說明指針確實(shí)在范圍內(nèi),可以執(zhí)行drop指令了.

Pulling It All Together

最后我們擁有了所有的drag/drop的腳本片斷!下一個(gè)事情是我們將創(chuàng)建一個(gè)DOM處理.如果你不是很熟悉,請(qǐng)先閱讀我的JavaScript Primer on DOM Manipulation.

下面的代碼將創(chuàng)建container(容器),而且使任何一個(gè)需要drag/drop的item變成一個(gè)容器的item.代碼在這個(gè)文章第二個(gè)demo的后面,它可以用戶記錄一個(gè)list(列表),定為一個(gè)導(dǎo)航窗口在左邊或者右邊,或者更多的函數(shù)你可以想到的.

下一步我們將通過"假代碼"讓reader看到真代碼,下面為推薦:

1、當(dāng)document第一次載入時(shí),創(chuàng)建dragHelper DIV.dragHelper將給移動(dòng)的item加陰影.真實(shí)的item沒有被dragged,只是用了insertBefor和appendChild來移動(dòng)了,我們隱藏了dragHelper 

2、有了mouseDown與mouseUp函數(shù).所有的操作會(huì)對(duì)應(yīng)到當(dāng)?shù)絠MouseDown的狀態(tài)中,只有當(dāng)mouse左鍵為按下時(shí)iMouseDown才為真,否則為假. 

3、我們創(chuàng)建了全局變量DragDrops與全局函數(shù)CreateDragContainer.DragDrops包含了一系列相對(duì)彼此的容器.任何參數(shù)(containers)將通過CreatedcragContainer進(jìn)行重組與序列化,這樣可以自由的移動(dòng).CreateDragContainer函數(shù)也將item進(jìn)行綁定與設(shè)置屬性. 

4、現(xiàn)在我們的代碼知道每個(gè)item的加入,當(dāng)我們移動(dòng)處mouseMove,mouseMove函數(shù)首先會(huì)設(shè)置變量target,鼠標(biāo)移動(dòng)在上面的item,如果這個(gè)item在容器中(checked with getAttribute): 

運(yùn)行一小段代碼來改變目標(biāo)的樣式.創(chuàng)造rollover效果 
檢查鼠標(biāo)是否沒有放開,如果沒有 
設(shè)置curTarget代表當(dāng)前item 
記錄item的當(dāng)前位置,如果需要的話,我們可以將它返回 
克隆當(dāng)前的item到dragHelper中,我們可以移動(dòng)帶陰影效果的item. 
item拷貝到dragHelper后,原有的item還在鼠標(biāo)指針下,我們必須刪除掉dragObj,這樣腳本起作用,dragObj被包含在一個(gè)容器中. 
抓取容器中所有的item當(dāng)前坐標(biāo),高度/寬度,這樣只需要記錄一次,當(dāng)item被drag時(shí),每隨mouse移動(dòng),每移鐘就會(huì)記錄成千上萬次. 
如果沒有,不需要做任何事,因?yàn)檫@不是一個(gè)需要移動(dòng)的item 
5、檢查curTarget,它應(yīng)該包含一個(gè)被移動(dòng)的item,如果存在,進(jìn)行下面操作: 

開始移動(dòng)帶有陰影的item,這個(gè)item就是前文所創(chuàng)建的 
檢查每個(gè)當(dāng)前容器中的container,是否鼠標(biāo)已經(jīng)移動(dòng)到這些范圍內(nèi)了 
我們檢查看一下正在拖動(dòng)的item是屬于哪個(gè)container 
放置item在一個(gè)container的某一個(gè)item之前,或者整個(gè)container之后 
確認(rèn)item是可見的 
如果鼠標(biāo)不在container中,確認(rèn)item是不可見了. 
6、剩下的事就是捕捉mouseUp的事件了

[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]

你現(xiàn)在擁有了拖拽的所有東西.

下面的三個(gè)demo是記錄事件歷史.當(dāng)你的鼠標(biāo)在item上移動(dòng),將記錄所生的事件,如果你不明白可以嘗試一下鼠標(biāo)的劃過或者拖動(dòng),看有什么發(fā)生.


[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]

相關(guān)文章

  • Javascript confirm多種使用方法解析

    Javascript confirm多種使用方法解析

    這篇文章主要介紹了Javascript confirm多種使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • OpenCV.js實(shí)現(xiàn)喬丹動(dòng)圖素描效果圖文教程

    OpenCV.js實(shí)現(xiàn)喬丹動(dòng)圖素描效果圖文教程

    這篇文章主要為大家介紹了OpenCV.js實(shí)現(xiàn)喬丹動(dòng)圖素描效果的圖文教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 探討跨域請(qǐng)求資源的幾種方式(總結(jié))

    探討跨域請(qǐng)求資源的幾種方式(總結(jié))

    這篇文章主要介紹了探討跨域請(qǐng)求資源的幾種方式(總結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • js智能獲取瀏覽器版本UA信息的方法

    js智能獲取瀏覽器版本UA信息的方法

    下面小編就為大家?guī)硪黄猨s智能獲取瀏覽器版本UA信息的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • checkbox全選所涉及到的知識(shí)點(diǎn)介紹

    checkbox全選所涉及到的知識(shí)點(diǎn)介紹

    checkbox全選涉及到的知識(shí)點(diǎn)比如IE里起作用,火狐不起作用,getElementById()與getElementsByName()的區(qū)別等等
    2013-12-12
  • JS實(shí)現(xiàn)點(diǎn)擊掉落特效

    JS實(shí)現(xiàn)點(diǎn)擊掉落特效

    這篇文章主要介紹了JS實(shí)現(xiàn)點(diǎn)擊掉落特效,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • javascript正則表達(dá)式基礎(chǔ)知識(shí)入門

    javascript正則表達(dá)式基礎(chǔ)知識(shí)入門

    很長(zhǎng)時(shí)間沒看正則表達(dá)式了,碰巧今天用到,溫故知新了一把,這里記錄下來,分享給大家,都是些基礎(chǔ)的知識(shí),重點(diǎn)給大家講解的是正則表達(dá)式中4種常用的方法,50% 的舉一反三練習(xí)中的原創(chuàng)。
    2015-04-04
  • Javascript 作用域使用說明

    Javascript 作用域使用說明

    在傳統(tǒng)的面向?qū)ο蟪绦蛟O(shè)計(jì)中,主要關(guān)注于公用和私有作用域。公用作用域中的對(duì)象屬性可以從對(duì)象外部訪問,即開發(fā)者創(chuàng)建對(duì)象的實(shí)例后,就可使用它的公用屬性。
    2009-08-08
  • js實(shí)現(xiàn)的八點(diǎn)拖動(dòng)修改div大小的代碼

    js實(shí)現(xiàn)的八點(diǎn)拖動(dòng)修改div大小的代碼

    八點(diǎn)改變div大小的實(shí)現(xiàn)代碼,代碼相對(duì)來說并不多,需要的朋友可以參考下。
    2010-02-02
  • JS實(shí)現(xiàn)拖動(dòng)模態(tài)框案例

    JS實(shí)現(xiàn)拖動(dòng)模態(tài)框案例

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)拖動(dòng)模態(tài)框案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評(píng)論