HTML5拖放操作

拖放(DragDrop)是 HTML5 標(biāo)準(zhǔn)的組成部分。拖放顧名思義就是把一個(gè)對象抓取放到另一個(gè)位置带膜。在HTML5中渐逃,任何元素都支持拖放。

  • 瀏覽器支持情況

firefox忠聚,opera12Chrome唱捣, Safari5两蟀,Microsof EdgeIE9(IE6~8是有拖放的api的震缭,但是沒有dataTrasfer對象)赂毯。

  • 開啟draggable屬性

要想拖動網(wǎng)頁中的一個(gè)元素,我們必須給這個(gè)元素設(shè)置draggable的屬性為true拣宰。

<div draggable="true"></div>

大部分瀏覽器的圖片和鏈接是默認(rèn)可以拖動的党涕。

  • 拖動過程中觸發(fā)的事件

在拖動的過程中會觸發(fā)一系列事件。

drag ------ 被拖動元素在拖動的過程中會持續(xù)觸發(fā)巡社,給拖動元素設(shè)置該事件膛堤。
dragstart  ------ 被拖動元素在拖動開始時(shí)會觸發(fā),給拖動元素設(shè)置該事件晌该。
dragend ------ 被拖動元素在拖動結(jié)束時(shí)會觸發(fā)肥荔,給拖動元素設(shè)置該事件绿渣。
dragenter ------ 進(jìn)入目標(biāo)區(qū)域時(shí)會觸發(fā),給目標(biāo)區(qū)域設(shè)置該事件燕耿。
dragleave ------ 離開目標(biāo)區(qū)域時(shí)會觸發(fā)中符,給目標(biāo)區(qū)域設(shè)置該事件。
dragover ------ 進(jìn)入目標(biāo)區(qū)域時(shí)會持續(xù)觸發(fā)誉帅,給目標(biāo)區(qū)域設(shè)置該事件淀散。
drop ------ 結(jié)束拖放,也就是松開鼠標(biāo)時(shí)觸發(fā)蚜锨,目標(biāo)區(qū)域或者拖動元素都可設(shè)置档插。
  • 簡單的例子

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <style>
            .box{
                height:140px;
                width:140px;
                border:1px solid black;
                padding:25px;
                margin-bottom:20px;
            }
            .move{
                height:120px;
                width:120px;
                border:1px solid green;
                background:green;
            }
        </style>
        <script>
            function moveover(e){//拖動事件以參數(shù)形式傳進(jìn)函數(shù)內(nèi)部
                e.preventDefault();//去除瀏覽器默認(rèn)效果
            }
            function drop(e){
                e.preventDefault();
                var data=e.dataTransfer.getData("Text");//取到數(shù)據(jù)
                e.target.appendChild(document.getElementsByClassName(data)[0]);
            }
            function movestart(e){
                e.dataTransfer.setData("Text",e.target.className);//
在dataTrasfer對象上存儲數(shù)據(jù)
            }
        </script>
    </head>
    <body>
        //綁定事件形式的拖放操作
        <div class="box" ondragover="moveover(event)" ondrop="drop(event)"></div>
        <div class="move" draggable="true" ondragstart="movestart(event)"></div>
    </body>
</html>
圖.jpg
  • dataTransfer對象

拖動事件有一個(gè)dataTransfer屬性,它本身指向一個(gè)對象踏志,包含了與拖動相關(guān)的各種信息阀捅。

// dataTransfer的屬性
dropEffect ------ 拖放的操作類型,決定了瀏覽器如何顯示鼠標(biāo)形狀针余,可能的值為copy、move凄诞、link和none圆雁。
effectAllowed ------ 指定所允許的操作,可能的值為copy帆谍、move伪朽、link、copyLink汛蝙、copyMove烈涮、linkMove、all窖剑、none和uninitialized(默認(rèn)值坚洽,等同于all,即允許一切操作)西土。
files ------ 包含一個(gè)FileList對象讶舰,表示拖放所涉及的文件,主要用于處理從文件系統(tǒng)拖入瀏覽器的文件需了。
types ------ 儲存在DataTransfer對象的數(shù)據(jù)的類型跳昼。

// dataTransfer的方法
setData(format, data) ------ 在dataTransfer對象上儲存數(shù)據(jù)。第一個(gè)參數(shù)format用來指定儲存的數(shù)據(jù)類型肋乍,比如text鹅颊、url、text/html等墓造。
getData(format) ------ 從dataTransfer對象取出數(shù)據(jù)堪伍。
clearData(format) ------ 清除dataTransfer對象所儲存的數(shù)據(jù)锚烦。如果指定了format參數(shù),則只清除該格式的數(shù)據(jù)杠娱,否則清除所有數(shù)據(jù)挽牢。
setDragImage(imgElement, x, y) ------ 指定拖動過程中顯示的圖像。默認(rèn)情況下摊求,許多瀏覽器顯示一個(gè)被拖動元素的半透明版本禽拔。參數(shù)imgElement必須是一個(gè)圖像元素,而不是指向圖像的路徑室叉,參數(shù)x和y表示圖像相對于鼠標(biāo)的位置睹栖。
dataTransfer對象允許在其上存儲數(shù)據(jù),這使得在被拖動元素與目標(biāo)元素之間傳送信息成為可能茧痕。
  • 實(shí)例:拖動頁面元素

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <style>
            .divBox{
                width:200px;
                border:1px dotted black;
                margin:20px;
                padding:10px;
            }
            .divBox .move{
                height:40px;
                width:150px;
                border:1px solid green;
                background:green;
                margin:0px auto;
            }
        </style>
    </head>
    <body>
        <div class="divBox">
            <div class="move" draggable="true" ></div>
        </div>
        <div class="divBox"></div>
        <div class="divBox"></div>
        <div class="divBox"></div>
        <script>
            var moveBox = document.querySelector(".move");//選取第一個(gè)class為move的節(jié)點(diǎn)
            var boxs = document.querySelectorAll(".divBox");//選取所有class為divBox的節(jié)點(diǎn)

            moveBox.addEventListener("dragstart",function(e){//綁定一個(gè)監(jiān)聽事件野来,當(dāng)dragstart事件發(fā)生時(shí),調(diào)用回調(diào)函數(shù)
                e.dataTransfer.setData("text",e.target.className);//類名
            });

            moveBox.addEventListener("dragend",function(e){

            });

            for(var i = 0;i < boxs.length;i++){//給每個(gè)div綁定事件
                boxs[i].addEventListener('dragover', function(e) {
                    e.preventDefault();//避免瀏覽器的默認(rèn)值
                    e.dataTransfer.dropEffect = 'move';
                    this.style.border = '1px solid red';
                    this.style.height = '42px';
                    return false;
                });

                boxs[i].addEventListener('drop', function(e) {
                  e.preventDefault(); 
                  e.stopPropagation();
                  this.style.border = '1px dotted black';
                  this.style.height = '';
                  var data =  e.dataTransfer.getData('text');//取得數(shù)據(jù)
                  this.appendChild(document.getElementsByClassName(data)[0]);//把拖動元素放到目標(biāo)div中
                });

                boxs[i].addEventListener('dragenter', function(e) {
                  e.preventDefault(); 
                });

                boxs[i].addEventListener('dragleave', function(e) {
                  e.preventDefault();
                  this.style.border = '1px dotted black';
                  this.style.height = '';
                });
            }
        </script>
    </body>
</html>
圖2.jpg
  • 拖放的其他用途

拖放操作給交互本來就很少的html增加了很多樂趣踪旷,通過H5的拖放操作曼氛,我們還可以進(jìn)行板塊的復(fù)制,交換等令野,本人技術(shù)能力有限舀患,等研究明白了一定補(bǔ)上。

  • 資料與文獻(xiàn)

此文資料部分參考自:
草根程序員
W3C
如想更深入了解H5的拖放气破,請參考以上文獻(xiàn)聊浅。

作者:jingks
此為原創(chuàng)文章,請勿用在商業(yè)用途现使,轉(zhuǎn)載請標(biāo)明作者低匙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市碳锈,隨后出現(xiàn)的幾起案子顽冶,更是在濱河造成了極大的恐慌,老刑警劉巖殴胧,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渗稍,死亡現(xiàn)場離奇詭異,居然都是意外死亡团滥,警方通過查閱死者的電腦和手機(jī)竿屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灸姊,“玉大人拱燃,你說我怎么就攤上這事×撸” “怎么了碗誉?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵召嘶,是天一觀的道長。 經(jīng)常有香客問我哮缺,道長弄跌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任尝苇,我火速辦了婚禮铛只,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糠溜。我一直安慰自己淳玩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布非竿。 她就那樣靜靜地躺著蜕着,像睡著了一般。 火紅的嫁衣襯著肌膚如雪红柱。 梳的紋絲不亂的頭發(fā)上承匣,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音锤悄,去河邊找鬼悄雅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铁蹈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播众眨,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼握牧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了娩梨?” 一聲冷哼從身側(cè)響起沿腰,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狈定,沒想到半個(gè)月后颂龙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纽什,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年措嵌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芦缰。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡企巢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出让蕾,到底是詐尸還是另有隱情浪规,我是刑警寧澤或听,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站笋婿,受9級特大地震影響誉裆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缸濒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一足丢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绍填,春花似錦霎桅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卿闹,卻和暖如春揭糕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锻霎。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工著角, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旋恼。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓吏口,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冰更。 傳聞我的和親對象是個(gè)殘疾皇子产徊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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