drag and drop


一.被拖動的元素

  1. 如何使一個元素變得可拖動
一些標(biāo)簽?zāi)J(rèn)能夠拖動辣苏,如 "img", "a" 標(biāo)簽,要使任何元素都可拖動(draggable),HTML5元素有個新特性叫draggable塑猖,支持IE9+:
// draggable 有3個值true, false, inherit
<div id="dragbox" draggable="true"></div>

// 使默認(rèn)可拖動元素變得不可拖動
<a >google</a>
對于IE8-可以在mousedown的時候?qū)δ繕?biāo)元素添加一個dragdrop()方法(以下代碼僅針對IE8-):
<div id="box"></div>
// IE8-以下要考慮到兼容性問題
var box = document.getElementById("box");
box.attachEvent("onmousedown", function(event) {
    event = event || window.event;
    var target = event.target || event.srcElement;
    target.dragdrop();
})

2.被拖動元素拖動事件

  1. dragstart 按下鼠標(biāo)準(zhǔn)備拖動時觸發(fā),可以用于setData(),effectAllowed
  2. drag 拖動過程中觸發(fā)
  3. dragend 松開鼠標(biāo)的一瞬間觸發(fā)

二.可放置元素(droppable)

1.元素拖到可防止區(qū)域發(fā)生的事件

  1. dragenter 進(jìn)入元素邊界時觸發(fā) (可設(shè)置dropeffect)
  2. dragover 在元素內(nèi)移動時持續(xù)促發(fā)
  3. dragleave (放置不成功時觸發(fā))或者 drop (放置成功時觸發(fā)距境, 可用于getData())

2.如何使一個元素變?yōu)榭煞胖脜^(qū)域

只需要重寫dragenter,dragover默認(rèn)行為,F(xiàn)irefox要將drop默認(rèn)行為也重寫垮卓,為保持兼容性問題垫桂,將3個默認(rèn)行為都改寫:
// div樣式設(shè)置省略
<div id="dropTarget"></div>

var dropTarget = document.getElementById("dropTarget");
dropTarget.addEventListener("dragenter", function(e) {
    e.preventDefault();
}, false);

dropTarget.addEventListener("dragover", function(e) {
    e.preventDefault();
}, false);

dropTarget.addEventListener("drop", function(e) {
    e.preventDefault();
}, false);


三.dataTransfer對象

僅僅使元素變得可拖動,可放置沒有作用粟按,在拖動和放置的時候要進(jìn)行數(shù)據(jù)交換才有用诬滩。
dataTransfer是event的一個屬性,只有drag-and-drop事件觸發(fā)時才存在

1.主要的兩個方法setData()和getData()

setData(): 
1. @param1 數(shù)據(jù)類型 "text" 或者 "url", HTML5新增MIME類型灭将,這兩個類型對應(yīng)MIME類型為
"text/plain"和"text/uri-list"
2. @param2 字符串內(nèi)容
3. 應(yīng)該在 dragstart事件 中設(shè)置該屬性

getData() 
1. @param 接受數(shù)據(jù)類型 "Text"(T大寫為了保證兼容firefox) 或者 "url"
2. 應(yīng)當(dāng)在 drop事件 中獲取數(shù)據(jù)疼鸟,從而拖動目標(biāo)與放置目標(biāo)進(jìn)行數(shù)據(jù)交換

eg:
event.dataTransfer.setData("text", "some text");
event.dataTransfer.setData("url", "http://www.google.com");

var url = event.dataTransfer.getData("url") ||  
          event.dataTransfer.getData("text/uri-list");
var text = event.dataTransfer.getData("Text");

2.dropEffect和effectAllowed

表示拖動效果,以及鼠標(biāo)樣式
1. dropEffect 設(shè)置在 "dragenter" 事件發(fā)生時庙曙,none, move, copy, link 4種效果
2. effectAllowed 設(shè)置在 "dragstart" 事件發(fā)生時空镜, none, move, copy...多種樣式

3.其他一些屬性

setDragImage(element, x, y) 
允許在拖動時光標(biāo)下指定圖片顯示,3個參數(shù)
     @params1 一個html元素
     @params2 @params3 圖片坐標(biāo)
     不支持IE, 在"dragstart"事件時設(shè)置


四.具體示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style>
        .drag{
            width: 200px;
            height: 200px;
            background-color: red;
            display: inline-block;
            margin-right: 10px;
        }
        #boxB {
            margin-right: 0;
        }
        #big {
            width: 415px;
            height: 400px;
            background: green;
            margin: 20px auto;
        }
        section {
            width: 415px;
            height: 200px;
            background-color: gray;
            margin: 20px auto;
        }
    </style>
</head>
<body>
    <div id="big"></div>
    <section id="section">
        <div class="drag" id="boxA" draggable="true"></div>
        <div class="drag" id="boxB" draggable="true"></div> 
    </section>
     <script>
        var section = document.getElementById("section"),
            big = document.getElementById("big"),
            boxA = document.getElementById("boxA"),
            boxB = document.getElementById("boxB");


        // EventUtil.addHandler(boxA, "mousedown", function(e) {
        //  e = EventUtil.getEvent(e);
        //  var target = EventUtil.getTarget(e);
        //  target.dragDrop();
        // });
// dragstart事件handler
        function dragStart(event) {
            event = event || window.event;
            var target = event.target || event.srcElement;
            event.dataTransfer.effectAllowed = "move";
            event.dataTransfer.setData("Text", target.getAttribute("id"));
            event.dataTransfer.setDragImage(target, 100, 100);
            return true;
        }

        function dragEnter(event) {
            event = EventUtil.getEvent(event);
            event.preventDefault();
            return true;
        }
        function dragOver(event) {
            event = event || window.event;
            event.preventDefault();
        }
        // drop事件處理handler
        function dragDrop(event) {
            event = event || window.event;
            var data = event.dataTransfer.getData("Text");
            event.target.appendChild(document.getElementById(data));
            event.stopPropagation();
            return false;
        }
  
        boxA.addEventListener("dragstart", dragStart, false);
        boxB.addEventListener("dragstart", dragStart, false);

      // big設(shè)置為可放置元素
        big.addEventListener("dragenter", dragEnter, false);
        big.addEventListener("dragover", dragOver, false);
        big.addEventListener("drop", dragDrop, false);

      // section設(shè)置為可放置元素
        section.addEventListener("dragenter", dragEnter, false);
        section.addEventListener("dragover", dragOver, false);
        section.addEventListener("drop", dragDrop, false);
    </script>
</body>
</html>


五.小結(jié)

  1. 主要考慮如何讓元素如何變得可拖動
  2. 如何讓元素變?yōu)榭煞胖?/li>
  3. 元素在拖動與放置的時候進(jìn)行數(shù)據(jù)交換
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吴攒,隨后出現(xiàn)的幾起案子张抄,更是在濱河造成了極大的恐慌,老刑警劉巖洼怔,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欣鳖,死亡現(xiàn)場離奇詭異,居然都是意外死亡茴厉,警方通過查閱死者的電腦和手機(jī)泽台,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矾缓,“玉大人怀酷,你說我怎么就攤上這事∈任牛” “怎么了蜕依?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長琉雳。 經(jīng)常有香客問我样眠,道長,這世上最難降的妖魔是什么翠肘? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任檐束,我火速辦了婚禮,結(jié)果婚禮上束倍,老公的妹妹穿的比我還像新娘被丧。我一直安慰自己,他們只是感情好绪妹,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布甥桂。 她就那樣靜靜地躺著,像睡著了一般邮旷。 火紅的嫁衣襯著肌膚如雪黄选。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天婶肩,我揣著相機(jī)與錄音办陷,去河邊找鬼。 笑死狡孔,一個胖子當(dāng)著我的面吹牛懂诗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苗膝,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼殃恒,長吁一口氣:“原來是場噩夢啊……” “哼植旧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起离唐,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤病附,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后亥鬓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體完沪,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年嵌戈,在試婚紗的時候發(fā)現(xiàn)自己被綠了覆积。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡熟呛,死狀恐怖宽档,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庵朝,我是刑警寧澤吗冤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布竟贯,位于F島的核電站嘴纺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏愈涩。R本人自食惡果不足惜侄旬,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一肺蔚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧勾怒,春花似錦婆排、人聲如沸声旺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腮猖。三九已至鉴扫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澈缺,已是汗流浹背坪创。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留姐赡,地道東北人莱预。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像项滑,于是被迫代替她去往敵國和親依沮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 拖拽,拖放事件可以通過拖拽實現(xiàn)數(shù)據(jù)傳遞,達(dá)到良好的交互效果,如:從操作系統(tǒng)拖拽文件實現(xiàn)文件選擇,拖拽實現(xiàn)元素布局的...
    ConRon閱讀 1,656評論 0 2
  • 通過draggable=true設(shè)置是否可以被拖動(ie這個老表不支持) dragstart:拖拽開始時在被拖拽元...
    Sccong閱讀 4,341評論 0 0
  • 一、介紹 mousedown mouseup mousemove dragstart dragend drag (...
    codeSirCao閱讀 566評論 0 0
  • WWDC 2017 剛結(jié)束危喉,雖然如預(yù)期的一樣宋渔,缺少意料之外的驚喜,但依舊有不少新的特性和 API 值得圈點辜限。拋開 ...
    MrPeak閱讀 5,041評論 2 36
  • 筆墨里的時光#25/30 爸爸出生于1952年皇拣,那個吃不飽穿不暖的年代出生的人普遍是兄弟姐妹多。爸爸有三個...
    檸檬草LF閱讀 171評論 0 1