最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript原生拖放詳解

 更新時(shí)間:2024年11月25日 14:41:07   作者:橘貓吃不胖~  
本文介紹了HTML5拖放事件的處理方法,包括拖放事件的觸發(fā)順序、dataTransfer對(duì)象的使用以及可拖動(dòng)能力的設(shè)置,通過(guò)這些方法,可以實(shí)現(xiàn)更豐富的用戶交互效果

拖放事件

拖放事件可以讓開發(fā)者控制拖放操作的方方面面,關(guān)鍵的部分是確定每個(gè)事件是在哪里觸發(fā)的,有的事件在被拖放元素上觸發(fā),有的事件則在放置目標(biāo)上觸發(fā)。

當(dāng)某個(gè)元素被拖動(dòng)時(shí),會(huì)按順序觸發(fā)以下事件:

事件說(shuō)明
dragstart按住鼠標(biāo)不放開始移動(dòng)鼠標(biāo)時(shí)觸發(fā)
drag元素正在被拖動(dòng)時(shí)觸發(fā)
dragend停止拖動(dòng)時(shí)觸發(fā)

在把元素拖動(dòng)到一個(gè)有效的放置目標(biāo)上時(shí),會(huì)依次觸發(fā)以下事件:

事件說(shuō)明
dragenter被拖動(dòng)的元素進(jìn)入目標(biāo)容器時(shí)觸發(fā)
dragover被拖拽元素在目標(biāo)容器內(nèi)拖動(dòng)時(shí)觸發(fā)
dragleave被拖動(dòng)元素離開目標(biāo)容器時(shí)觸發(fā)
drop被拖動(dòng)元素放到了目標(biāo)容器上觸發(fā)

如果我們想讓一個(gè)元素可以被拖放,還要為該元素添加dragabble屬性

dataTransfer對(duì)象

dataTransfer對(duì)象實(shí)現(xiàn)了拖動(dòng)操作中的數(shù)據(jù)傳輸,用于從被拖動(dòng)元素向放置目標(biāo)傳遞字符串?dāng)?shù)據(jù)。

因?yàn)檫@個(gè)對(duì)象是event的屬性,所以在拖放事件的事件處理程序外部無(wú)法訪問(wèn)dataTransfer。

該對(duì)象內(nèi)部有以下屬性和方法:

事件說(shuō)明
dropEffect可以告訴瀏覽器允許哪種放置行為,獲取當(dāng)前選定的拖放操作類型或者設(shè)置的為一個(gè)新的類型。值必須為none, copy, link、move。
effectAllowed表示對(duì)被拖動(dòng)元素是否允許dropEffect,提供所有可用的操作類型。必須是none, copy, copyLink, copyMove, link, linkMove, move, all、uninitialized之一。
files包含數(shù)據(jù)傳輸中可用的所有本地文件的列表。如果拖動(dòng)操作不涉及拖動(dòng)文件,則此屬性為空列表。
items提供一個(gè)包含所有拖動(dòng)數(shù)據(jù)列表的DataTransferItemList對(duì)象。
types一個(gè)提供dragstart事件中設(shè)置的格式的strings數(shù)組。
clearData()刪除與給定類型關(guān)聯(lián)的數(shù)據(jù)。類型參數(shù)是可選的。如果類型為空或未指定,則刪除與所有類型關(guān)聯(lián)的數(shù)據(jù)。如果指定類型的數(shù)據(jù)不存在,或者data transfer中不包含任何數(shù)據(jù),則該方法不會(huì)產(chǎn)生任何效果。
getData()檢索給定類型的數(shù)據(jù),如果該類型的數(shù)據(jù)不存在或data transfer不包含數(shù)據(jù),則返回空字符串。
setData()設(shè)置給定類型的數(shù)據(jù)。如果該類型的數(shù)據(jù)不存在,則將其添加到末尾,以便類型列表中的最后一項(xiàng)將是新的格式。如果該類型的數(shù)據(jù)已經(jīng)存在,則在相同位置替換現(xiàn)有數(shù)據(jù)。
setDragImage()用于設(shè)置自定義的拖動(dòng)圖像。

可拖動(dòng)能力

HTML5在所有HTML元素上規(guī)定了一個(gè)draggable屬性,表示元素是否可以拖動(dòng)。

圖片和鏈接的draggable屬性自動(dòng)被設(shè)置為true,而其他所有元素此屬性的默認(rèn)值為false。

如果想讓其他元素可拖動(dòng),或者不允許圖片和鏈接被拖動(dòng),都可以設(shè)置這個(gè)屬性。

示例代碼:

<!-- 禁止拖動(dòng)圖片 -->
<img src="smile.gif" draggable="false" alt="Smiley face">
<!-- 讓元素可以拖動(dòng) -->
<div draggable="true">...</div>

一個(gè)拖動(dòng)demo

設(shè)置一個(gè)可以拖拽的元素:

<div id="draggable" draggable="true">Drag me!</div>
#draggable {
  width: 100px;
  height: 100px;
  background-color: #3498db;
  color: #fff;
  text-align: center;
  line-height: 100px;
  cursor: move;
  position: absolute;
}

const draggableElement = document.getElementById('draggable');
let offsetX, offsetY;
draggableElement.addEventListener('dragstart', function (event) {
  // 拖動(dòng)開始時(shí)計(jì)算鼠標(biāo)位置與元素左上角的偏移,并記錄
  offsetX = event.clientX - draggableElement.getBoundingClientRect().left;
  offsetY = event.clientY - draggableElement.getBoundingClientRect().top;
});

draggableElement.addEventListener('drag', function (event) {
  // 計(jì)算元素應(yīng)該移動(dòng)到的位置
  const x = event.clientX - offsetX;
  const y = event.clientY - offsetY;
  // 更新元素位置
  draggableElement.style.left = x + 'px';
  draggableElement.style.top = y + 'px';
});

draggableElement.addEventListener('dragend', function (event) {
  const x = event.clientX - offsetX;
  const y = event.clientY - offsetY;
  // 拖動(dòng)結(jié)束之后更新元素的位置
  draggableElement.style.left = x + 'px';
  draggableElement.style.top = y + 'px';
});

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript中字符串和字符串拼接操作實(shí)例代碼

    JavaScript中字符串和字符串拼接操作實(shí)例代碼

    這篇文章主要介紹了JavaScript中字符串和字符串拼接操作的相關(guān)資料,文中通過(guò)示例代碼詳解講解了創(chuàng)建方式、不可變性及長(zhǎng)度屬性,包括+、+=、concat()、模板字符串拼接方法,需要的朋友可以參考下
    2025-05-05
  • JavaScript中使用ActiveXObject操作本地文件夾的方法

    JavaScript中使用ActiveXObject操作本地文件夾的方法

    以前一直用vbscript來(lái)操作文件夾,才發(fā)現(xiàn)原來(lái)使用JavaScript也是可以的,肯定不如vbs用的簡(jiǎn)單,不過(guò)學(xué)習(xí)一下還是不錯(cuò)的
    2014-03-03
  • JavaScript設(shè)計(jì)模式之代理模式實(shí)例分析

    JavaScript設(shè)計(jì)模式之代理模式實(shí)例分析

    這篇文章主要介紹了JavaScript設(shè)計(jì)模式之代理模式,簡(jiǎn)單描述了代理模式的概念、原理并結(jié)合實(shí)例形式分析了javascript代理模式的相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2019-01-01
  • 微信小程序?qū)崿F(xiàn)蒙版彈出窗功能

    微信小程序?qū)崿F(xiàn)蒙版彈出窗功能

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)蒙版彈出窗功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • JavaScript 加號(hào)(+)運(yùn)算符號(hào)

    JavaScript 加號(hào)(+)運(yùn)算符號(hào)

    在一些框架中看到了類似這樣的寫法:+new Date();感覺(jué)有些怪,查閱了相關(guān)資料和一些網(wǎng)友的幫助.對(duì)此用法解釋如下,希望對(duì)大家有所幫助,不合適的地方請(qǐng)大家指正!
    2009-12-12
  • JavaScript插件化開發(fā)教程(五)

    JavaScript插件化開發(fā)教程(五)

    這篇文章是JavaScript插件化開發(fā)系列教程的第五篇,還是著重于實(shí)戰(zhàn),通過(guò)具體的實(shí)例來(lái)學(xué)習(xí)jQuery的方式如何開發(fā)插件,有相同需求的小伙伴來(lái)參考下吧。
    2015-02-02
  • ES6入門教程之Array.from()方法

    ES6入門教程之Array.from()方法

    這篇文章主要給大家介紹了關(guān)于ES6入門教程之Array.from()方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ES6具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 深入探討TypeScript中類與接口的使用

    深入探討TypeScript中類與接口的使用

    TypeScript是一種強(qiáng)大的編程語(yǔ)言,它在JavaScript的基礎(chǔ)上添加了靜態(tài)類型檢查,使得代碼更加可維護(hù)和類型安全,在TypeScript中,類和接口是構(gòu)建復(fù)雜應(yīng)用程序的關(guān)鍵組成部分,本文將深入探討TypeScript中類與接口的使用,需要的朋友可以參考下
    2023-09-09
  • 改變隱藏的input中value值的方法

    改變隱藏的input中value值的方法

    這篇文章主要介紹了改變隱藏的input中value值的方法,需要的朋友可以參考下
    2014-03-03
  • js實(shí)現(xiàn)Tab選項(xiàng)卡切換效果

    js實(shí)現(xiàn)Tab選項(xiàng)卡切換效果

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)Tab選項(xiàng)卡切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評(píng)論

敖汉旗| 金沙县| 怀仁县| 体育| 壤塘县| 浙江省| 永顺县| 天等县| 河津市| 辽阳市| 运城市| 岚皋县| 万荣县| 博湖县| 福泉市| 普定县| 卫辉市| 永昌县| 图木舒克市| 延边| 时尚| 澄迈县| 济宁市| 乾安县| 凤山市| 资兴市| 绥芬河市| 巴彦县| 灵寿县| 信宜市| 平潭县| 吴堡县| 阿拉善左旗| 五大连池市| 台湾省| 松江区| 渑池县| 普定县| 宕昌县| 武川县| 霍林郭勒市|