HTML ææ¾ï¼Drag and Dropï¼æ¥å£ä½¿åºç¨ç¨åºè½å¤å¨æµè§å¨ä¸ä½¿ç¨ææ¾åè½ãä¾å¦ï¼ç¨æ·å¯ä½¿ç¨é¼ æ 鿩坿æ½ï¼draggableï¼å ç´ ï¼å°å ç´ ææ½å°å¯æ¾ç½®ï¼droppableï¼å ç´ ï¼å¹¶éæ¾é¼ æ æé®ä»¥æ¾ç½®è¿äºå ç´ ãææ½æä½æé´ï¼ä¼æä¸ä¸ªå¯ææ½å ç´ çåéæå¿«ç §è·éçé¼ æ æéã
对äºç½ç«ãæ©å±ä»¥å XUL åºç¨ç¨åºï¼ä½ å¯ä»¥èªå®ä¹ä»ä¹å ç´ æ¯å¯ææ½çã坿æ½å ç´ äº§ççåé¦ç±»åï¼ä»¥å坿¾ç½®çå ç´ ã
æ¤ææ¡£ä¸º HTML ææ¾çæ¦è¿°ï¼å å«äºç¸å ³æ¥å£ç说æãå¨åºç¨ç¨åºä¸å å ¥ææ¾æ¯æçåºæ¬æ¥éª¤ï¼ä»¥åç¸å ³æ¥å£ç使ç¨ç®ä»ã
ææ½äºä»¶HTML ç drag & drop 使ç¨äº DOM event model
以åä» mouse events
ç»§æ¿èæ¥ç drag events
ãä¸ä¸ªå
¸åçææ½æä½æ¯è¿æ ·çï¼ç¨æ·éä¸ä¸ä¸ª*坿æ½çï¼draggableï¼å
ç´ ï¼å¹¶å°å
¶ææ½ï¼é¼ æ 䏿¾å¼ï¼å°ä¸ä¸ªå¯æ¾ç½®çï¼droppableï¼*å
ç´ ï¼ç¶åéæ¾é¼ æ ã
卿使é´ï¼ä¼è§¦åä¸äºäºä»¶ç±»åï¼æä¸äºäºä»¶ç±»åå¯è½ä¼è¢«å¤æ¬¡è§¦åï¼æ¯å¦drag
å dragover
äºä»¶ç±»åï¼ã
ææç ææ½äºä»¶ç±»å æä¸ä¸ªå¯¹åºç ææ½å ¨å±å±æ§ãæ¯ä¸ªææ½äºä»¶ç±»ååææ½å ¨å±å±æ§é½æå¯¹åºçæè¿°ææ¡£ãä¸é¢çè¡¨æ ¼æä¾äºä¸ä¸ªç®ççäºä»¶ç±»åæè¿°ï¼ä»¥åä¸ä¸ªç¸å ³ææ¡£ç龿¥ã
**注æï¼**å½ä»æä½ç³»ç»åæµè§å¨ä¸ææ½æä»¶æ¶ï¼ä¸ä¼è§¦å dragstart
ådragend
äºä»¶ã
HTML çææ½æ¥å£æ DragEvent
, DataTransfer
, DataTransferItem
åDataTransferItemList
ã
DragEvent
æ¥å£æä¸ä¸ªæé 彿°åä¸ä¸ª dataTransfer
屿§ï¼dataTransfer 屿§æ¯ä¸ä¸ª DataTransfer
对象ã
DataTransfer
对象å
å«äºææ½äºä»¶çç¶æï¼ä¾å¦ææ½äºä»¶çç±»åï¼å¦æ·è´ copy
æè
ç§»å¨ move
ï¼ï¼ææ½çæ°æ®ï¼ä¸ä¸ªæè
å¤ä¸ªé¡¹ï¼åæ¯ä¸ªææ½é¡¹çç±»åï¼MIME ç±»åï¼ã DataTransfer
å¯¹è±¡ä¹æåææ½æ°æ®ä¸æ·»å æå é¤é¡¹ç®çæ¹æ³ã
ç»åºç¨ç¨åºæ·»å HTML ææ¾åè½ï¼DragEvent
å DataTransfer
æ¥å£åºè¯¥æ¯å¯äºéè¦çæ¥å£ï¼Firefox ç» DataTransfer
æ·»å äºä¸äº Gecko ä¸æçæ©å±åè½ï¼ä½è¿äºæ©å±åªå¨ Firefox ä¸å¯ç¨ï¼ã
æ¯ä¸ª DataTransfer
é½å
å«ä¸ä¸ª items
屿§ï¼è¿ä¸ªå±æ§æ¯ DataTransferItem
对象ç list
ãä¸ä¸ª DataTransferItem
代表ä¸ä¸ªææ½é¡¹ç®ï¼æ¯ä¸ªé¡¹ç®é½æä¸ä¸ª kind
屿§ï¼string
æ file
ï¼åä¸ä¸ªè¡¨ç¤ºæ°æ®é¡¹ç® MIME ç±»åç type
屿§ãDataTransferItem
å¯¹è±¡ä¹æè·åææ½é¡¹ç®æ°æ®çæ¹æ³ã
DataTransferItemList
å¯¹è±¡æ¯ DataTransferItem
对象çå表ãè¿ä¸ªå表对象å
å«ä»¥ä¸æ¹æ³ï¼ååè¡¨ä¸æ·»å ææ½é¡¹ï¼ä»å表ä¸ç§»é¤ææ½é¡¹åæ¸
空åè¡¨ä¸ææçææ½é¡¹ã
DataTransfer
å DataTransferItem
æ¥å£çä¸ä¸ªä¸»è¦çä¸åæ¯åè
使ç¨åæ¥ç getData()
æ¹æ³å»å¾å°ææ½é¡¹çæ°æ®ï¼èåè
使ç¨å¼æ¥ç getAsString()
æ¹æ³å¾å°ææ½é¡¹çæ°æ®ã
注æï¼DragEvent
å DataTransfer
æ¥å£æ¯æææ¡é¢æµè§å¨é½æ¯æçã使¯ï¼ DataTransferItem
åDataTransferItemList
æ¥å£å¹¶ä¸è¢«æææµè§å¨æ¯æãè¯·ç§»æ¥ äºæä½æ§ äºè§£æ´å¤å
³äºææ½è¡ä¸ºçä¿¡æ¯ã
Mozilla å Firefox æ¯æä¸äºä¸å¨æ åææ¾æ¨¡åä¸çç¹æ§ã请æ¥ç DataTransfer
åè页以è·åææ Gecko 䏿屿§ å Gecko ä¸ææ¹æ³ã
è¿ä¸é¨åæ»ç»äºç»åºç¨ç¨åºå å ¥ææ¾åè½çåºæ¬æ¥éª¤ã
ç¡®å®ä»ä¹æ¯å¯ææ½ç让ä¸ä¸ªå
ç´ è¢«ææ½éè¦æ·»å draggable
屿§ï¼åå ä¸å
¨å±äºä»¶å¤ç彿°ondragstart
ï¼å¦ä¸é¢ç示ä¾ä»£ç æç¤ºï¼
<script>
function dragstart_handler(ev) {
// Add the target element's id to the data transfer object
ev.dataTransfer.setData("text/plain", ev.target.id);
}
window.addEventListener("DOMContentLoaded", () => {
// Get the element by id
const element = document.getElementById("p1");
// Add the ondragstart event listener
element.addEventListener("dragstart", dragstart_handler);
});
</script>
<p id="p1" draggable="true">This element is draggable.</p>
æ¥çæ´å¤ draggable 屿§ å ææ½æä½æåã
å®ä¹ææ½æ°æ®åºç¨ç¨åºå¯ä»¥å¨ææ½æä½ä¸å
å«ä»»ææ°éçæ°æ®é¡¹ãæ¯ä¸ªæ°æ®é¡¹é½æ¯ä¸ä¸ª string
ç±»åï¼å
¸åç MIME ç±»åï¼å¦ï¼text/html
ã
æ¯ä¸ª drag event
齿ä¸ä¸ªdataTransfer
屿§ï¼å
¶ä¸ä¿åçäºä»¶çæ°æ®ãè¿ä¸ªå±æ§ï¼DataTransfer
对象ï¼ä¹æç®¡çææ½æ°æ®çæ¹æ³ãsetData()
æ¹æ³ä¸ºææ½æ°æ®æ·»å ä¸ä¸ªé¡¹ï¼å¦ä¸é¢ç示ä¾ä»£ç æç¤ºï¼
function dragstart_handler(ev) {
// æ·»å ææ½æ°æ®
ev.dataTransfer.setData("text/plain", ev.target.innerText);
ev.dataTransfer.setData("text/html", ev.target.outerHTML);
ev.dataTransfer.setData(
"text/uri-list",
ev.target.ownerDocument.location.href,
);
}
æ¥ç æ¨èææ½ç±»å äºè§£å¯ææ½çå¸¸è§æ°æ®ç±»åï¼å¦ææ¬ãHTMLã龿¥åæä»¶ï¼ï¼ç§»æ¥ ææ½æ°æ® è·åæ´å¤æå ³ææ½æ°æ®çä¿¡æ¯ã
å®ä¹ææ½å¾åææ½è¿ç¨ä¸ï¼æµè§å¨ä¼å¨é¼ æ ææ¾ç¤ºä¸å¼ é»è®¤å¾çãå½ç¶ï¼åºç¨ç¨åºä¹å¯ä»¥éè¿ setDragImage()
æ¹æ³èªå®ä¹ä¸å¼ å¾çï¼å¦ä¸é¢çä¾åæç¤ºã
function dragstart_handler(ev) {
// Create an image and then use it for the drag image.
// NOTE: change "example.gif" to a real image URL or the image
// will not be created and the default drag image will be used.
var img = new Image();
img.src = "example.gif";
ev.dataTransfer.setDragImage(img, 10, 10);
}
欲äºè§£æ´å¤å ³äºææ½å¾åçä¿¡æ¯ï¼è§ è®¾ç½®ææ½å¾åã
å®ä¹ææ½æædropEffect
屿§ç¨æ¥æ§å¶ææ¾æä½ä¸ç¨æ·ç»äºçåé¦ãå®ä¼å½±åå°ææ½è¿ç¨ä¸æµè§å¨æ¾ç¤ºçé¼ æ æ ·å¼ãæ¯å¦ï¼å½ç¨æ·æ¬åå¨ç®æ å
ç´ ä¸çæ¶åï¼æµè§å¨é¼ æ ä¹è®¸è¦åæ ææ¾æä½çç±»åã
æ 3 个ææå¯ä»¥å®ä¹ï¼
copy
表æè¢«ææ½çæ°æ®å°ä»å®åæ¬çä½ç½®æ·è´å°ç®æ çä½ç½®ãmove
表æè¢«ææ½çæ°æ®å°è¢«ç§»å¨ãlink
表æå¨ææ½æºä½ç½®åç®æ ä½ç½®ä¹é´å°ä¼å建ä¸äºå
³ç³»è¡¨æ ¼ææ¯è¿æ¥ã卿æ½è¿ç¨ä¸ï¼ææ½ææä¹è®¸ä¼è¢«ä¿®æ¹ä»¥ç¨äºè¡¨æå¨å ·ä½ä½ç½®ä¸å ·ä½æææ¯å¦è¢«å 许ï¼å¦æå 许ï¼å¨è¯¥ä½ç½®å被å 许æ¾ç½®ã
以ä¸ä¾å表æå¦ä½ä½¿ç¨è¯¥å±æ§ã
function dragstart_handler(ev) {
ev.dataTransfer.dropEffect = "copy";
}
æ¥ç ææ½ææ æ´å¤ç»èã
å®ä¹ä¸ä¸ªæ¾ç½®åºå½ææ½ä¸ä¸ªé¡¹ç®å° HTML å
ç´ ä¸æ¶ï¼æµè§å¨é»è®¤ä¸ä¼æä»»ä½ååºãæ³è¦è®©ä¸ä¸ªå
ç´ åæå¯éæ¾åºåï¼è¯¥å
ç´ å¿
须设置 ondragover
å ondrop
äºä»¶å¤çç¨åºå±æ§ï¼ä¸é¢çä¾åéè¿ç®åçäºä»¶å¤çå±ç¤ºäºå¦ä½ä½¿ç¨è¿äºå±æ§ï¼
<script>
function dragover_handler(ev) {
ev.preventDefault();
ev.dataTransfer.dropEffect = "move";
}
function drop_handler(ev) {
ev.preventDefault();
// Get the id of the target and add the moved element to the target's DOM
var data = ev.dataTransfer.getData("text/plain");
ev.target.appendChild(document.getElementById(data));
}
</script>
<p
id="target"
ondrop="drop_handler(event)"
ondragover="dragover_handler(event)">
Drop Zone
</p>
æ³¨ææ¯ä¸ªå¤çç¨åºè°ç¨ preventDefault()
æ¥é»æ¢å¯¹è¿ä¸ªäºä»¶çå
¶ä»å¤çè¿ç¨ï¼å¦è§¦ç¹äºä»¶ææéäºä»¶ï¼ã
欲äºè§£æ´å¤ä¿¡æ¯ï¼åè§ æå®éæ¾ç®æ ã
å¤çæ¾ç½®æædrop
äºä»¶çå¤çç¨åºæ¯ä»¥ç¨åºæå®çæ¹æ³å¤çææ½æ°æ®ãä¸è¬ï¼ç¨åºè°ç¨ getData()
æ¹æ³ååºææ½é¡¹ç®å¹¶æä¸å®æ¹å¼å¤çãç¨åºæä¹æ ¹æ® dropEffect
çå¼ä¸/æå¯åæ´å
³é®åçç¶æèä¸å
ä¸é¢çä¾åå±ç¤ºäºä¸ä¸ªå¤çç¨åºï¼ä»ææ½æ°æ®ä¸è·åäºä»¶æºå
ç´ ç id
ç¶åæ ¹æ® id
ç§»å¨æºå
ç´ å°ç®æ å
ç´ ï¼
<script>
function dragstart_handler(ev) {
// Add the target element's id to the data transfer object
ev.dataTransfer.setData("application/my-app", ev.target.id);
ev.dataTransfer.dropEffect = "move";
}
function dragover_handler(ev) {
ev.preventDefault();
ev.dataTransfer.dropEffect = "move";
}
function drop_handler(ev) {
ev.preventDefault();
// Get the id of the target and add the moved element to the target's DOM
var data = ev.dataTransfer.getData("application/my-app");
ev.target.appendChild(document.getElementById(data));
}
</script>
<p id="p1" draggable="true" ondragstart="dragstart_handler(event)">
This element is draggable.
</p>
<div
id="target"
ondrop="drop_handler(event)"
ondragover="dragover_handler(event)">
Drop Zone
</div>
æ´å¤ä¿¡æ¯è¯·åè§ æ§è¡éæ¾ã
ææ½ç»æææ½æä½ç»ææ¶ï¼å¨æºå
ç´ ï¼å¼å§ææ½æ¶çç®æ å
ç´ ï¼ä¸è§¦å dragend
äºä»¶ãä¸ç®¡ææ½æ¯å®æè¿æ¯è¢«åæ¶è¿ä¸ªäºä»¶é½ä¼è¢«è§¦åãdragend
äºä»¶å¤çç¨åºå¯ä»¥æ£æ¥dropEffect
屿§ç弿¥ç¡®è®¤ææ½æåä¸å¦ã
æ´å¤å ³äºå¤çææ½ç»æçä¿¡æ¯è¯·åè§ ç»æææ½ã
äºæä½æ§å¨ æ°æ®äº¤æ¢å¯¹è±¡æ¥å£çæµè§å¨å
¼å®¹æ§è¡¨ ä¸å¯ä»¥çå°ææ¾å¨æ¡é¢æµè§å¨ä¸ç¸å¯¹æ¯æå¾æ¯è¾å®æ´ï¼é¤äº DataTransferItem
å DataTransferItemList
æ¥å£æ¯æå¾è¾å°ï¼ãè¿ä¸ªæ°æ®ä¹æ¾ç¤ºåºææ¾æä½å¨ç§»å¨æµè§å¨ä¸æ¯æå¾é常弱ã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4