2020-12-22 學習筆記,自己看的

DragEvent是一個表示drag和drop交互的DOM event接口危喉。用戶通過將指針設備(如:鼠標)放在目標的表面開始拖動钻趋,然后拖動指針到一個新的位置(如其他DOM元素)。應用程序自動的解析拖放交互毁靶。DragEvent接口從mouseEvent和Event那兒繼承屬性胧奔。

Event types

DragEvent并不是一個單一的事件,它包含了多個事件预吆,這些事件分別是:drag龙填,dragstart,dragenter啡浊,dragend觅够,dragover,dragexit巷嚣,dragleave喘先,drop。

drag:這個事件在元素拖拽的過程中反復觸發(fā)廷粒,每一百毫秒觸發(fā)一次窘拯。這事件的目標元素是被拖的那個元素,該事件可冒泡坝茎,可取消默認行為涤姊。

dragstart:這個事件在用戶開始拖動時觸發(fā)。這個事件的目標元素是被拖的那個元素嗤放,在這些事件中思喊,dragstart事件最先觸發(fā)。該事件可冒泡次酌,可取消默認行為恨课。

dragenter:這個事件在被拖的元素進入一個合法的可drop目標時觸發(fā)。這個事件的目標元素是這個可drop目標岳服。該事件可冒泡剂公,可取消默認行為。

dragover:當被拖的元素在可drop目標范圍內移動時反復觸發(fā)這個事件吊宋,一百毫秒觸發(fā)一次纲辽。這個事件的目標元素是這個可drop目標。該事件可冒泡,可取消默認行為拖吼。

dragend:當拖拽結束時觸發(fā)這個事件鳞上,這個事件的目標元素是被拖的元素。在這些事件中dragend最后觸發(fā)绿贞。該事件可冒泡因块,不能取消默認行為。

dragleave:這個事件在被拖得元素離開合法的可drop目標時觸發(fā)籍铁。這個事件的目標元素是這個可drop目標涡上。該事件可冒泡,不能取消默認行為拒名。

dragexit:當一個可drop元素不再是拖拽操作最近的drop目標時觸發(fā)這個事件吩愧。這個事件的目標元素是這個可drop元素。該事件可冒泡增显,不嫩取消默認行為雁佳。

drop:當在可drop目標上松開拖動元素的指針設備時觸發(fā)這個事件,該事件的目標元素是這個可drop目標同云。drop事件在dragend事件觸發(fā)之前觸發(fā)糖权。這個事件可冒泡,可取消默認行為炸站。

? ? ? ? test target? ? ? ? ? ? #drag{

? ? ? ? ? ? width:200px;

? ? ? ? ? ? height:200px;

? ? ? ? ? ? background-color: aqua;

? ? ? ? }

? ? ? ? .drop{

? ? ? ? ? ? width: 300px;

? ? ? ? ? ? height: 300px;

? ? ? ? ? ? background-color: antiquewhite;

? ? ? ? }

? ? ? ?

? ? ? ? 我可以拖動

? ?

? ? ? ? ? ? document.addEventListener('drag',function(event){

? ? ? ? ? ? event.target.style.backgroundColor = 'black';

? ? ? ? },false);

? ? ? ? document.addEventListener('dragstart',function(event){

? ? ? ? ? ? event.target.style.backgroundColor = 'red';

? ? ? ? },false);

? ? ? ? document.addEventListener('dragend',function(event){

? ? ? ? ? ? event.target.style.backgroundColor = 'yellow';

? ? ? ? },false);

? ? ? ? document.addEventListener('dragover',function(event){

? ? ? ? ? ? event.preventDefault();

? ? ? ? ? ? event.target.style.backgroundColor = 'blue';

? ? ? ? },false);

? ? ? ? document.addEventListener('dragenter',function(event){

? ? ? ? ? ? event.target.style.backgroundColor = 'green';

? ? ? ? },false);

? ? ? ? document.addEventListener('dragleave',function(event){

? ? ? ? ? ? event.target.style.backgroundColor = 'pink';

? ? ? ? },false);

? ? ? ? document.addEventListener('dragexit',function(event){

? ? ? ? ? ? event.target.style.backgroundColor = 'red'? ? ? ? },false);

? ? ? ? document.addEventListener('drop',function(event){

? ? ? ? ? ? event.preventDefault();

? ? ? ? ? ? event.target.style.backgroundColor = 'white';

? ? ? ? ? ? console.log(2);

? ? ? ? },false)


這些事件的事件對象包含鼠標事件的事件對象的方法與屬性星澳。之外還存在一個dataTransfer屬性

讓元素可拖

在HTML中默認可拖的元素只有image,link及被選擇的文本旱易。要讓其他元素可拖禁偎,需要做下面這三件事:

1.給元素設置一個draggable屬性,并且將這個屬性的值設置為true

2.在這個元素上添加一個dragstart的事件監(jiān)聽

3.在dragstart的事件監(jiān)聽上通過event.DataTransfer.setData(type,value)設置拖拽數(shù)據(jù)阀坏。

<div draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'This text may be dragged')">? ? ? This text <strong>may</strong> be dragged.

? ? </div>

如果draggable屬性被禁止或者設置為false如暖,那么這個元素不能被拖拽。draggable屬性可以在任何屬性上設置忌堂。當一個元素設置為可拖盒至,在這個元素上點擊或拖動鼠標,這個元素里的文本或其他元素不會被選中士修。當用戶開始拖動妄迁,dragstart事件會被觸發(fā),在dragstart事件中李命,你能夠通過setData()指定拖拽數(shù)據(jù),通過setDragImage()指定圖片反饋箫老,以及通過設置effectAllowed屬性和dropEffect屬性指定拖拽效果封字。拖拽數(shù)據(jù)是必須指定的,但是圖片反饋是拖拽效果不是必須的

拖拽數(shù)據(jù)

拖拽數(shù)據(jù)包含兩部分信息,分別是數(shù)據(jù)的類型和數(shù)據(jù)的值阔籽,數(shù)據(jù)的類型是字符串流妻,數(shù)據(jù)的值也是字符串形式。 拖拽數(shù)據(jù)的類型有:text/plain,text/html,image/jpeg,text/uri-list等笆制,還能夠自定義類型绅这。

可以多次調用setData()方法設置多個拖拽數(shù)據(jù)。如下:

vardt = event.dataTransfer;

dt.setData("application/x-bookmark",bookmarkString);

dt.setData('text/uri-list','www.baidu.com');

dt.setData('text/plain','drag data');

application/x-bookmark是自定義類型在辆。

如果通過這個方法設置新的類型的數(shù)據(jù)证薇,那么這個新的拖拽數(shù)據(jù)會位于拖拽數(shù)據(jù)列表的尾部,如果設置以及存在的類型的數(shù)據(jù)匆篓,那么新的數(shù)據(jù)會覆蓋舊的數(shù)據(jù)浑度。

通過getData()能夠得到指定類型的拖拽數(shù)據(jù)

通過clearData()能夠清除指定類型的拖拽數(shù)據(jù)

圖片反饋

圖片反饋并不是必須設置的,默認它是從拖拽目標上生成的一個半透明圖片鸦概,并且這個圖片在拖拽期間會跟著鼠標移動箩张。你能夠通過setDragImage(image,xOffect,yOffect)方法自定義圖片反饋。

setDragImage()接受三個參數(shù)窗市,第一個參數(shù)表示圖片引用先慷,第二個和第三個表示圖片左上角相對于鼠標指針的位置。單位是像素

? ? ? ? test target? ? ? ? ? ? #drag{

? ? ? ? ? ? width:200px;

? ? ? ? ? ? height:200px;

? ? ? ? ? ? background-color: aqua;

? ? ? ? }

? ? ? ? .drop{

? ? ? ? ? ? width: 300px;

? ? ? ? ? ? height: 300px;

? ? ? ? ? ? background-color: antiquewhite;

? ? ? ? }

? ? ? ?

? ? ? ? 我可以拖動

? ? ? ? ?

? ? ? ? document.addEventListener('dragstart',function(event){

? ? ? ? ? ? event.target.style.backgroundColor = 'red';

? ? ? ? ? ? event.dataTransfer.setDragImage(document.getElementById('img'),30,30);

? ? ? ? },false);



拖拽效果

通過設置effectAllowed和dropEffect可以指定拖拽效果

事件對象的dataTransfer屬性

dataTransfer屬性是一個DataTransfer對象咨察,在這個屬性中保存了拖拽操作過程中的數(shù)據(jù)论熙,它可能保存一個或者多個數(shù)據(jù)項。這個屬性是只讀的扎拣。

dataTransfer屬性中的標準屬性

1.dropEffect

得到當前drag and drop操作的類型赴肚,或者設置給當前drag and drop 設置新的類型。這個屬性可能取值是none二蓝,copy誉券,move,link刊愚。這屬性會影響拖拽過程中的鼠標的顯示形式踊跟。

2.effectAllowed

這個屬性用于指定運行的拖拽操作效果,可選的值有none鸥诽,all商玫,copy,move牡借,link拳昌,copyLink,copyMove钠龙,linkMove炬藤。默認情況這個值是all御铃,如果要設置這個屬性的值就要在dragstart的事件處理程序里進行設置。

3.files

包含了在data transfer中的所有可用的本地文件列表沈矿,如果被拖拽操作沒有涉及文件上真,那么它是一個空列表。

4.items

是一個包含了所有拖拽數(shù)據(jù)的列表羹膳。它是一個DataTransferItemList對象睡互。

5.types

它是一個字符串數(shù)組,這個數(shù)組中包含在dragstart事件處理程序中設置的拖拽事件的類型陵像,如果拖拽操作不存在數(shù)據(jù)就珠,那么他得到一個空數(shù)組。

DataTransfer屬性的標準方法

1.clearData(type):移除給定類型相關的拖拽數(shù)據(jù)蠢壹。接受一個可選的參數(shù)嗓违,如果這個參數(shù)是空或者沒有指定,那么移除所以類型的數(shù)據(jù)图贸,如果指定的類型不存在或者data transfer中不包含數(shù)據(jù)蹂季,那么這個方法不會產生什么影響。

2.getData(type):得到指定類型的拖拽數(shù)據(jù)疏日。如果指定類型的數(shù)據(jù)不存在或者data transfer中不包含數(shù)據(jù)偿洁, 得到一個空的字符串。

3.setData(type沟优,value):設置給定類型的拖拽數(shù)據(jù)涕滋。接受兩個參數(shù),第一個參數(shù)是類型挠阁,第二個參數(shù)是指定類型的值宾肺。 如果這個類型的值不存在,那么在類型列表的最后添加一個新的格式侵俗,如果已經存在的,那么在相同的位置 存在的數(shù)據(jù)被替換.

4.setDragImage(image锨用,xoffset,yoffset):接受三個參數(shù)隘谣,第一個參數(shù)是圖片的引用增拥,第二個和第三個參數(shù)是移動的圖片的 左上角相對鼠標的位置。

DataTransferItemList對象

通過dataTransfer.items得到的值就是DataTransferList對象寻歧。

DataTransferItemList對象的屬性

1.length:得到拖拽數(shù)據(jù)的數(shù)量

DataTransferItemList對象的方法

1.add():向拖拽數(shù)據(jù)列表中添加一個新的拖拽數(shù)據(jù)掌栅,添加成功后返回這個新的拖拽數(shù)據(jù)。當添加一個文件到拖拽數(shù)據(jù)列表中码泛,這個方法只接受一個文件對象作為參數(shù)猾封。當添加一個給定 類型的字符串到拖拽數(shù)據(jù)列表中,這個方法接受兩個參數(shù)噪珊,第一個參數(shù)是數(shù)據(jù)忘衍,第二個參數(shù)是類型逾苫。

2.remove(index):從拖拽數(shù)據(jù)列表中移除指定位置的拖拽數(shù)據(jù)。這個方法接受一個表示位置的參數(shù)枚钓,如果這個參數(shù)小于0或者大于拖拽數(shù)據(jù)列表的長度,拖拽數(shù)據(jù)列表不會發(fā)生改變瑟押。

3.clear():移除拖拽數(shù)據(jù)列表中所有的拖拽數(shù)據(jù)搀捷。不需要參數(shù)。

4.DataTransferItem(index):得到指定位置上的拖拽數(shù)據(jù)多望。接受一個表示位置的參數(shù)嫩舟, 這個方法簡寫形式是數(shù)組索引。

DataTransferItem對象

dataTransfer.items中的每一項都是DataTransferItem對象怀偷。

DataTransferItem對象的屬性

1.kind:得到拖拽數(shù)據(jù)的鍵家厌,可能的值有file和string

2.type:得到拖拽數(shù)據(jù)的類型,是MINE type

DataTransferItem對象的方法

1.getAsFile():返回拖拽數(shù)據(jù)的文件對象椎工。如果拖拽數(shù)據(jù)不是文件則返回null

2.getAsString(function):調用回調函數(shù)饭于,這個回調函數(shù)將拖拽數(shù)據(jù)項的字符串形式作為它的參數(shù)

拖拽文件

要使文件能夠被拖放的一個重要步驟是定義一個放置區(qū)域。并且為放置區(qū)域添加drop维蒙,dragover和dragend事件處理程序掰吕。

當為一個元素添加drop事件的處理程序,及在dragover事件處理程序中取消瀏覽器的默認行為颅痊,那么這個元素就是放置區(qū)域殖熟。

另外,在drag和drop操作結束之后斑响,應用程序應該移除拖拽數(shù)據(jù)(可能是一個或者多個文件)菱属,數(shù)據(jù)的清理通常在 dragend事件處理程序中。

<div id="drop_zone" ondrop="drop_handler(event);" ondragover="dragover_handler(event);" ondragend = "dragend_handler(event)"><strong><Drag one or more files to this Drop Zone ...</strong></div>


例子一舰罚,訪問文件名

function drop_handler(ev) {

? console.log("Drop");

? ev.preventDefault();

? // If dropped items aren't files, reject themvardt = ev.dataTransfer;

? if (dt.items) {

? ? // Use DataTransferItemList interface to access the file(s)for(vari=0; i < dt.items.length; i++) {

? ? ? if(dt.items[i].kind == "file") {

? ? ? ? varf = dt.items[i].getAsFile();

? ? ? ? console.log("... file[" + i + "].name = " + f.name);

? ? ? }

? ? }

? } else {

? ? // Use DataTransfer interface to access the file(s)for(vari=0; i < dt.files.length; i++) {

? ? ? console.log("... file[" + i + "].name = " + dt.files[i].name);

? ? }

? }

}

例子二纽门,阻止瀏覽器默認行為

function dragover_handler(ev) {

? console.log("dragOver");

? // Prevent default select and drag behavior? ev.preventDefault();

}

?例子三,清除數(shù)據(jù)

function dragend_handler(ev) {

? console.log("dragEnd");

? // Remove all of the drag datavardt = ev.dataTransfer;

? if (dt.items) {

? ? // Use DataTransferItemList interface to remove the drag datafor(vari = 0; i < dt.items.length; i++) {

? ? ? dt.items.remove(i);

? ? }

? } else {

? ? // Use DataTransfer interface to remove the drag data? ? ev.dataTransfer.clearData();

? }

}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末沸停,一起剝皮案震驚了整個濱河市膜毁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愤钾,老刑警劉巖瘟滨,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異能颁,居然都是意外死亡杂瘸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門伙菊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來败玉,“玉大人敌土,你說我怎么就攤上這事≡艘恚” “怎么了返干?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長血淌。 經常有香客問我矩欠,道長,這世上最難降的妖魔是什么悠夯? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任癌淮,我火速辦了婚禮,結果婚禮上沦补,老公的妹妹穿的比我還像新娘乳蓄。我一直安慰自己,他們只是感情好夕膀,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布虚倒。 她就那樣靜靜地躺著,像睡著了一般店诗。 火紅的嫁衣襯著肌膚如雪裹刮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天庞瘸,我揣著相機與錄音捧弃,去河邊找鬼。 笑死擦囊,一個胖子當著我的面吹牛违霞,可吹牛的內容都是我干的。 我是一名探鬼主播瞬场,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼买鸽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贯被?” 一聲冷哼從身側響起眼五,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彤灶,沒想到半個月后看幼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡幌陕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年诵姜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搏熄。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡棚唆,死狀恐怖暇赤,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情宵凌,我是刑警寧澤鞋囊,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站瞎惫,受9級特大地震影響失暴,放射性物質發(fā)生泄漏。R本人自食惡果不足惜微饥,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望古戴。 院中可真熱鬧欠橘,春花似錦、人聲如沸现恼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叉袍。三九已至始锚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喳逛,已是汗流浹背瞧捌。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留润文,地道東北人姐呐。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像典蝌,于是被迫代替她去往敵國和親曙砂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容