æ¬ææè¿°äºææ¾æä½ä¸åççæ¥éª¤ã
æ¬ææ¡£ä¸æè¿°çæå¨æä½ä½¿ç¨ DataTransfer
æ¥å£ãæ¬ææ¡£ä¸ä½¿ç¨ DataTransferItem
æ¥å£å DataTransferItemList
æ¥å£ã
draggable
ï¼å±æ§
å¨ä¸ä¸ªç½é¡µä¸ï¼æå ç§ç¹å®æ åµä¼ä½¿ç¨é»è®¤ææ½è¡ä¸ºï¼å ¶ä¸å æ¬ææ½é䏿æ¬ãææ½å¾ååææ½é¾æ¥ãå½ä¸ä¸ªå¾åæé¾æ¥è¢«ææ½æ¶ï¼å¾åæé¾æ¥ç URL 被设å®ä¸ºææ½æ°æ®ã对äºå ¶ä»å ç´ ï¼åªå½å®ä»¬æ¯è¢«éä¸çä¸é¨åæ¶ï¼æä¼è§¦åé»è®¤ææ½è¡ä¸ºã妿æ³ççææ½å®é çæ ·åï¼å¯ä»¥éä¸ç½é¡µçä¸é¨åï¼ç¶åæä½é¼ æ ï¼æå¨éä¸çç®æ ãéä¸çé¨åæ ¹æ®ç³»ç»çä¸å伿ä¸åçæ¸²æææï¼å¹¶å¨ææ½æ¶è·éçé¼ æ æéãç¶èï¼è¿åªæ¯é»è®¤ææ½è¡ä¸ºçææï¼æ¤æ¶æ²¡æçå¬ç¨åºè°æ´ææ½æ°æ®ã
å¨ HTML ä¸ï¼é¤äºå¾åã龿¥åéæ©çææ¬é»è®¤ç坿æ½è¡ä¸ºä¹å¤ï¼å ¶ä»å ç´ å¨é»è®¤æ åµä¸æ¯ä¸å¯ææ½çã
è¦ä½¿å ¶ä»ç HTML å ç´ å¯ææ½ï¼å¿ é¡»åä¸ä»¶äºï¼
draggable
屿§è®¾ç½®æ "true"
ãdragstart
äºä»¶æ·»å ä¸ä¸ªçå¬ç¨åºãè®¾ç½®ææ½æ°æ®
ãä¸é¢çä¾åå è®¸ææ½ä¸ä¸ªæ®µè½çå 容ï¼
<p
draggable="true"
ondragstart="event.dataTransfer.setData('text/plain', 'This text may be dragged')">
This text <strong>may</strong> be dragged.
</p>
屿§ draggable
设置为 "true"
ï¼æä»¥è¿ä¸ªå
ç´ åæå¯ææ½çãå¦æè¯¥å±æ§è¢«çç¥æè¢«è®¾ç½®ä¸º "false"
ï¼å该å
ç´ å°ä¸å¯ææ½ï¼æ¤æ¶ææ½åªä¼é䏿æ¬ã
draggable
屿§å¯å¨ä»»æå
ç´ ä¸è®¾ç½®ï¼å
æ¬å¾åå龿¥ãç¶èï¼å¯¹äºå两è
ï¼è¯¥å±æ§çé»è®¤å¼æ¯ true
ï¼æä»¥ä½ åªä¼å¨ç¦ç¨è¿äºè
çææ½æ¶ä½¿ç¨å° draggable
屿§ï¼å°å
¶è®¾ç½®ä¸º false
ã
夿³¨ï¼ å½ä¸ä¸ªå ç´ è¢«è®¾ç½®æå¯ææ½æ¶ï¼å ç´ ä¸çææ¬åå ¶ä»åå ç´ ä¸è½å以æ£å¸¸çæ¹å¼ï¼éè¿é¼ æ ç¹å»åææ½ï¼è¢«éä¸ãç¨æ·å¿ é¡»æä½ alt é®ï¼åç¨é¼ æ éæ©ææ¬ï¼æè 使ç¨é®çéæ©ã
å¼å§ææ½æä½è¿ä¸ªä¾åä½¿ç¨ ondragstart
屿§ä¸º dragstart
äºä»¶æ·»å çå¬ç¨åºã
<p
draggable="true"
ondragstart="event.dataTransfer.setData('text/plain', 'This text may be dragged')">
This text <strong>may</strong> be dragged.
</p>
å½ç¨æ·å¼å§ææ½æ¶ï¼ä¼è§¦å dragstart
äºä»¶ã
å¨è¿ä¸ªä¾åä¸ï¼dragstart
äºä»¶çå¬ç¨åºè¢«æ·»å å°å¯ææ½å
ç´ æ¬èº«ï¼ç¶èï¼ä½ å¯ä»¥çå¬ä¸ä¸ªç¥å
å
ç´ ï¼å 为就å大夿°å
¶ä»äºä»¶ä¸æ ·ï¼ææ½äºä»¶ä¼å泡ã
å¨ dragstart
äºä»¶ä¸ï¼ä½ å¯ä»¥æå®ææ½æ°æ®ãåé¦å¾ååææ½ææï¼ææè¿äºé½å°å¨ä¸é¢æè¿°ãä¸è¿ï¼æä»¬åªéè¦è®¾ç½®ææ½æ°æ®ï¼å 为å¨å¤§å¤æ°æ
åµä¸é»è®¤çå¾ååææ½ææé½æ¯éç¨çã
ææææ½äºä»¶
齿ä¸ä¸ªå为 dataTransfer
ç屿§ï¼å®ææææ½æ°æ®ï¼dataTransfer
æ¯ä¸ä¸ª DataTransfer
对象ï¼ã
彿æ½åçæ¶ï¼æ°æ®å¿ é¡»ä¸è¢«ææ½ç项ç®ç¸å ³èãä¾å¦ï¼å½å¨ææ¬æ¡ä¸ææ½éå®çææ¬æ¶ï¼ä¸ææ½æ°æ®é¡¹ç¸å ³èçæ°æ®å°±æ¯ææ¬æ¬èº«ã类似å°ï¼å½å¨ Web 页é¢ä¸ææ½é¾æ¥æ¶ï¼ææ½æ°æ®é¡¹å°±æ¯é¾æ¥ç URLã
DataTransfer
å
å«ä¸¤ä¸ªä¿¡æ¯ï¼æ°æ®çç±»åï¼ææ ¼å¼ï¼åæ°æ®å¼ãæ ¼å¼æ¯ä¸ä¸ªç±»åå符串ï¼ä¾å¦ææ¬æ°æ®çæ ¼å¼æ¯ text/plain
ï¼ï¼å¼æ¯ä¸ä¸ªææ¬åç¬¦ä¸²ãææ½å¼å§æ¶ï¼ä½ æä¾æ°æ®ç±»ååæ°æ®å¼ã卿æ½è¿ç¨ä¸ï¼å¨ dragenter
å dragover
äºä»¶çå¬ç¨åºä¸ï¼ä½ ä½¿ç¨ææ½æ°æ®çç±»åæ¥æ£æ¥æ¯å¦å
许æ¾ç½®ï¼dropï¼ãä¾å¦ï¼æ¥å龿¥çæ¾ç½®ç®æ å°æ£æ¥é¾æ¥ç±»å text/uri-list
ã卿¾ç½®äºä»¶ä¸ï¼çå¬ç¨åºå°ååææ½æ°æ®ï¼å¹¶å°å
¶æå
¥å°æ¾ç½®ä½ç½®ã
DataTransfer
ç types
屿§è¿åä¸ä¸ªç±»ä¼¼ DOMString
ç MIME-type çå表ï¼å¦ text/plain
æ image/jpeg
ãä½ è¿å¯ä»¥å建èªå·±çç±»åãæå¸¸ç¨çç±»ååå¨æç« æ¨èææ½ç±»å ä¸ã
䏿¬¡ææ½å¯è½å
æ¬å 个ä¸åç±»åçæ°æ®é¡¹ãè¿ä½¿å¾æ°æ®å¯ä»¥æ´å
·ä½çç±»åæä¾ï¼é常æ¯èªå®ä¹ç±»åï¼ä½è¥æ¾ç½®ç®æ 䏿¯æè¿äºå
·ä½ç±»åï¼å伿ä¾åéï¼fallbackï¼æ°æ®ãé常æ
åµä¸ï¼æä¸å
·ä½çç±»åæ¯ text/plain
ç±»åçæ®éææ¬æ°æ®ï¼å³ä¸äºç®åçææ¬è¡¨ç¤ºã
è¦å¨ dataTransfer
ä¸è®¾ç½®ææ½æ°æ®é¡¹ï¼ä½¿ç¨ setData()
æ¹æ³ãè¿ä¸ªæ¹æ³æ¥æ¶ä¸¤ä¸ªåæ°ï¼å³æ°æ®ç±»ååæ°æ®å¼ãä¾å¦ï¼
event.dataTransfer.setData("text/plain", "Text to drag");
å¨è¿ä¸ªä¾åä¸ï¼æ°æ®å¼æ¯âText to dragâï¼æ°æ®ç±»åæ¯ text/plain
æ ¼å¼ã
ä½ å¯ä»¥æä¾å¤ç§æ ¼å¼çæ°æ®ãè¦åå°è¿ä¸ç¹ï¼å¯ä»¥ç¨ä¸åçæ ¼å¼å¤æ¬¡è°ç¨ setData()
æ¹æ³ãä½ åºè¯¥ä¼ å
¥å°½éå
·ä½çæ ¼å¼ã
const dt = event.dataTransfer;
dt.setData("application/x.bookmark", bookmarkString);
dt.setData("text/uri-list", "http://www.mozilla.org");
dt.setData("text/plain", "http://www.mozilla.org");
å¨è¿éï¼æ°æ®è¢«æ·»å å°ä¸ç§ä¸åçç±»åä¸ã第ä¸ä¸ªç±»å application/x-bookmark
æ¯ä¸ç§èªå®ä¹ç±»åãå
¶ä»åºç¨ç¨åºä¸ä¼æ¯æè¿ä¸ªç±»åï¼ä½ä½ å¯ä»¥å¨åä¸ç«ç¹æå以åºç¨ç¨åºä¹é´ä½¿ç¨èªå®ä¹ç±»åã
éè¿æä¾å
¶ä»ç±»åçæ°æ®ï¼æä»¬è¿å¯ä½¿ç¨ä¸é£ä¹å
·ä½ç形弿¯æææ½å°å
¶ä»åºç¨ç¨åºãapplication/x.bookmark
ç±»åå¯ä»¥æä¾æ´å¤çæ°æ®ï¼ä»¥ä¾¿å¨åºç¨ç¨åºä¸ä½¿ç¨ï¼èå¦ä¸¤ä¸ªç±»åååªå
å«ä¸ä¸ª URL æææ¬çæ¬ã
注æï¼å¨æ¬ä¾ä¸ï¼text/uri-list
å text/plain
å
å«ç¸åçæ°æ®ãè¿éå¸¸æ¯æ£ç¡®çï¼ä½ä¸ä¸å®è¦è¿ä¹åã
å¦æä½ è¯å¾ä»¥ç¸åçæ ¼å¼æ·»å ä¸¤æ¬¡æ°æ®ï¼é£ä¹æ°çæ°æ®å°æ¿æ¢æ§çæ°æ®ãä½ å¯ä»¥ä½¿ç¨ clearData()
æ¹æ³æ¸
é¤è¿äºæ°æ®ï¼è¯¥æ¹æ³æ¥æ¶ä¸ä¸ªåæ°ï¼å³è¦å é¤çæ°æ®ç±»åã
event.dataTransfer.clearData("text/uri-list");
clearData()
æ¹æ³ç type
åæ°æ¯å¯éçãå¦ææ²¡æå£°æ type
ï¼åææç±»åçæ°æ®é½ä¼è¢«å é¤ãå¦æææ½ä¸å
å«ææ½æ°æ®é¡¹ï¼æè
ææçæ°æ®é¡¹é½è¢«æ¸
é¤ï¼é£ä¹å°±ä¸ä¼åºç°ææ½è¡ä¸ºã
彿æ½åçæ¶ï¼ä¼çæææ½ç®æ çä¸ä¸ªåéæå¾åï¼è§¦å"dragstart
" äºä»¶çå
ç´ ï¼ï¼å¹¶å¨ææ½è¿ç¨ä¸è·è¸ªé¼ æ æéãè¿ä¸ªå¾åæ¯èªå¨å建çï¼æä»¥ä½ ä¸éè¦èªå·±å建å®ã使¯ï¼ä½ å¯ä»¥ä½¿ç¨ setDragImage()
æ¹æ³æ¥èªå®ä¹ææ½åé¦å¾åã
event.dataTransfer.setDragImage(image, xOffset, yOffset);
è¿ä¸ä¸ªåæ°é½æ¯å¿
è¦çã第ä¸ä¸ªæ¯å¾åçå¼ç¨ãè¿ä¸ªå¼ç¨é常æ¯ä¸ä¸ª <img>
å
ç´ ï¼ä½ä¹å¯ä»¥æ¯ <canvas>
æä»»ä½å
¶ä»å
ç´ ãçæçåé¦å¾åå°±æ¯è¯¥å¾åå¨å±å¹ä¸çæ ·åï¼ä»¥å¾ååå§ç大å°ç»å¶ãsetDragImage()
æ¹æ³ç第äºãä¸ä¸ªåæ°æ¯å¾åä½ç½®ç¸å¯¹äºé¼ æ æéä½ç½®çåç§»éã
ä¹å¯ä»¥ä½¿ç¨ä¸å¨ææ¡£ä¸çå¾ååç»å¸ãè¿ç§ææ¯å¨ä½¿ç¨ canvas å ç´ ç»å¶èªå®ä¹çææ½åé¦å¾åæ¶é常æç¨ï¼å¦ä¸é¢çä¾åï¼
function dragWithCustomImage(event) {
var canvas = document.createElementNS(
"http://www.w3.org/1999/xhtml",
"canvas",
);
canvas.width = canvas.height = 50;
var ctx = canvas.getContext("2d");
ctx.lineWidth = 4;
ctx.moveTo(0, 0);
ctx.lineTo(50, 50);
ctx.moveTo(0, 50);
ctx.lineTo(50, 0);
ctx.stroke();
var dt = event.dataTransfer;
dt.setData("text/plain", "Data to Drag");
dt.setDragImage(canvas, 25, 25);
}
å¨è¿ä¸ªä¾åä¸ï¼æä»¬åäºä¸ä¸ªæ¯ç»å¸çææ½å¾åãå½ç»å¸å®½ 50 åç´ ï¼é« 50 åç´ æ¶ï¼æä»¬ä½¿ç¨ä¸åçåç§»éï¼25 å 25ï¼ï¼è¿æ ·é¼ æ æéå³ä¸ºå¾åä¸å¿ã
ææ½ææææ½è¿ç¨ä¸å¯è½ä¼æ§è¡ä¸äºæä½ãcopy
æä½ç¨æ¥æç¤ºè¢«ææ½çæ°æ®å°ä»å½åä½ç½®å¤å¶å°æ¾ç½®ä½ç½®ãmove
æä½æç¤ºè¢«ææ½çæ°æ®ä¼è¢«ç§»å¨ï¼link
æä½è¡¨ç¤ºå¨æºåæ¾ç½®ä½ç½®ä¹é´å°ä¼å建æç§å½¢å¼çå
³ç³»æè¿æ¥ã
ä½ å¯ä»¥å¨ dragstart
äºä»¶çå¬ç¨åºä¸è®¾ç½® effectAllowed
屿§ä»¥æå®å
è®¸ææ½æºå¤´æ§è¡ä¸ç§æä½ä¸çåªå ç§ã
event.dataTransfer.effectAllowed = "copy";
å¨è¿ä¸ªä¾åä¸ï¼åªå 许å¤å¶æä½ã
ä½ å¯ä»¥ä¸åçæ¹å¼ç»åè¿äºå¼ï¼
none
ä¸å 许æä½
copy
åªå¤å¶
move
åªç§»å¨
link
åªé¾æ¥
copyMove
å¤å¶æç§»å¨
copyLink
å¤å¶æé¾æ¥
linkMove
龿¥æç§»å¨
all
å¤å¶ãç§»å¨æé¾æ¥
注æï¼è¿äºå¼å¿
é¡»åä¸é¢ååºç飿 ·ä½¿ç¨ãä¾å¦ï¼å° effectAllowed
屿§è®¾ç½®ä¸º copyMove
å
许å¤å¶æç§»å¨æä½ï¼ä½é»æ¢ç¨æ·æ§è¡é¾æ¥æä½ã屿§é»è®¤å
è®¸ä»¥ä¸ææçæä½ï¼allï¼ï¼æä»¥ä½ ä¸éè¦è°æ´è¿ä¸ªå±æ§ï¼é¤éä½ æ³è¦æé¤æä¸ªç¹å®æä½ã
å¨ææ½æä½æé´ï¼dragenter
æ dragover
äºä»¶ççå¬ç¨åºå¯ä»¥æ£æ¥ effectAllowed
屿§ï¼ä»¥æ¥çåªäºæä½æ¯å
许çãç¸å
³ç dropEffect
屿§åºè¯¥å¨å
¶ä¸çä¸ä¸ªäºä»¶ä¸è®¾ç½®ï¼æ¥æå®åºè¯¥æ§è¡åªä¸ä¸ªå项æä½ãdropEffect
æ¯ none
ãcopy
ãmove
æ link
ãè¿ä¸ªå±æ§ä¸ä½¿ç¨ä¸è¿°çç»åå¼ã
å¨ dragenter
å dragover
äºä»¶ä¸ï¼dropEffect
屿§è¢«åå§åä¸ºç¨æ·è¯·æ±çææãç¨æ·å¯ä»¥éè¿æä¸ä¿®é¥°é®æ¥ä¿®æ¹ä¸ºæéçææã尽管使ç¨ä»ä¹ä¿®é¥°é®åå³äºä¸åçå¹³å°ï¼ä½å
¸åæ
åµä¸ï¼Shift å Ctrl é®ç¨äºå¨å¤å¶ãç§»å¨å龿¥ä¹é´åæ¢ãé¼ æ æé伿¹åæ ·å¼ä»¥æç¤ºéè¦çæä½ï¼ä¾å¦ï¼å¯¹äº"å¤å¶"æä½ï¼å
æ å¯è½ä¼å¨æè¾¹åºç°å å·ã
ä½ å¯ä»¥å¨ dragenter
æ dragover
äºä»¶æé´ä¿®æ¹ dropEffect
屿§ï¼ä¾å¦å°æä¸ªæ¾ç½®ç®æ è®¾ç½®ä¸ºåªæ¯ææäºæä½ãä½ å¯ä»¥ä¿®æ¹ dropEffect
屿§æ¥è¦çç¨æ·æå®çææï¼å¹¶å¼ºå¶ä¿®æ¹ä¸ºä¸ä¸ªç¹å®çæ¾ç½®æä½ã注æï¼è¿ä¸ªææå¿
é¡»æ¯ effectAllowed
屿§ä¸çä¸ä¸ªãå¦åï¼å®å°è¢«è®¾ç½®ä¸ºå
è®¸çæ¿ä»£å¼ã
event.dataTransfer.dropEffect = "copy";
å¨è¿ä¸ªä¾åä¸ï¼æ¾ç½®æææ¯å¤å¶ã
ä½ å¯ä»¥ä½¿ç¨ none
表示å¨è¿ä¸ªä½ç½®ä¸å
è®¸ä»»ä½æ¾ç½®ï¼å°½ç®¡å¨è¿ç§æ
åµä¸ï¼æå¥½ä¸è¦åæ¶äºä»¶ã
å¨ drop
å dragend
äºä»¶ä¸ï¼ä½ å¯ä»¥æ£æ¥ dropEffect
屿§ï¼ä»¥ç¡®å®æç»éæ©äºåªç§ææã妿æéçæææ¯ "move"
ï¼é£ä¹åºè¯¥å¨ dragend
äºä»¶ä¸ä»ææ½æºå¤´å é¤ææ½æ°æ®ã
dragenter
æ dragover
äºä»¶ççå¬ç¨åºç¨äºè¡¨ç¤ºææçæ¾ç½®ç®æ ï¼ä¹å°±æ¯è¢«ææ½é¡¹ç®å¯è½æ¾ç½®çå°æ¹ãç½é¡µæåºç¨ç¨åºç大夿°åºåé½ä¸æ¯æ¾ç½®æ°æ®çææä½ç½®ãå æ¤ï¼è¿äºäºä»¶çé»è®¤å¤çæ¯ä¸å
许æ¾ç½®ã
å¦æä½ æ³è¦å
许æ¾ç½®ï¼ä½ å¿
须忶 dragenter
å dragover
äºä»¶æ¥é»æ¢é»è®¤çå¤çãä½ å¯ä»¥å¨å±æ§å®ä¹çäºä»¶çå¬ç¨åºè¿å false
ï¼æè
è°ç¨äºä»¶ç preventDefault()
æ¹æ³æ¥å®ç°è¿ä¸ç¹ãå¨ä¸ä¸ªç¬ç«èæ¬ä¸çå®ä¹ç彿°éï¼å¯è½åè
æ´å¯è¡ã
<div ondragover="return false"></div>
<div ondragover="event.preventDefault()"></div>
å¨ dragenter
å dragover
äºä»¶ä¸è°ç¨ preventDefault()
æ¹æ³å°è¡¨æå¨è¯¥ä½ç½®å
许æ¾ç½®ã使¯ï¼ä½ é叏叿åªå¨æäºæ
åµä¸è°ç¨ preventDefault()
æ¹æ³ï¼å¦åªå½ææ½çæ¯é¾æ¥æ¶ï¼ã
è¦åå°è¿ä¸ç¹ï¼è°ç¨ä¸ä¸ªå½æ°ä»¥æ£æ¥æ¡ä»¶ï¼å¹¶ä¸åªå¨æ»¡è¶³æ¡ä»¶æ¶åæ¶äºä»¶ã妿æ¡ä»¶æªæ»¡è¶³ï¼åä¸åæ¶äºä»¶ï¼æ¤æ¶ç¨æ·éæ¾é¼ æ æé®ä¸ä¼æ§è¡æ¾ç½®ã
æå¸¸è§çæ¯æ ¹æ®æ°æ®ä¼ è¾ä¸ææ½æ°æ®çç±»åæ¥æ¥åææç»æ¾ç½®ââä¾å¦ï¼å
许æ¾ç½®å¾åæé¾æ¥ï¼æè
é½å
许ãä½ å¯ä»¥æ£æ¥ dataTransfer
屿§ç types
屿§æ¥æ¥çåªäºç±»åå
许æ¾ç½®ãtypes
屿§è¿åä¸ä¸ªå符串类åçæ°ç»ï¼è¿äºåç¬¦ä¸²ç±»åæ¯å¨ææ½å¼å§æ¶æ·»å çï¼é¡ºåºæ¯ä»æéè¦å°æä¸éè¦ã
function contains(list, value) {
for (var i = 0; i < list.length; ++i) {
if (list[i] === value) return true;
}
return false;
}
function doDragOver(event) {
var isLink = contains(event.dataTransfer.types, "text/uri-list");
if (isLink) {
event.preventDefault();
}
}
卿¬ä¾ä¸ï¼æä»¬ä½¿ç¨ includes
æ¹æ³æ¥æ£æ¥ text/uri-list
æ¯å¦åºç°å¨ç±»åå表ä¸ã妿åºç°äºï¼æä»¬å°åæ¶è¿ä¸ªäºä»¶ä»¥å
许æ¾ç½®ãå¦æææ½æ°æ®ä¸å
å«é¾æ¥ï¼åä¸åæ¶äºä»¶ï¼æ¤ä½ç½®ä¹ä¸å
许æ¾ç½®ã
å¦æä½ å¸ææ´å
·ä½å°éå¶æä½ç±»åï¼ä½ å¯è½è¿éè¦è®¾ç½® effectAllowed
æ dropEffect
屿§ï¼æè
两è
é½è®¾ç½®ãå½ç¶ï¼å¦æä½ ä¸åæ¶è¿ä¸ªäºä»¶ï¼æ¹åè¿ä¸¤ä¸ªå±æ§ä¸ä¼æä»»ä½ææã
æå ç§æ¹æ³å¯ä»¥åç¨æ·è¡¨æåªä¸ªä½ç½®å
许æ¾ç½®ãé¼ æ æéå°æ ¹æ® dropEffect
屿§çå¼åå¿
è¦çæ´æ°ãé¼ æ æéå
·ä½çå¤è§åå³äºç¨æ·å¹³å°ï¼å
¸åçå¦å å·å¾æ ä¼åºç°å¨ 'copy
' ä¸ï¼èä¸å
许æ¾ç½®æ¶ï¼ä¼åºç°ç¦æ¢æ¾ç½®ç徿 ãå¨è®¸å¤æ
åµä¸ï¼é¼ æ æéåé¦å°±è¶³å¤äºã
使¯ï¼ä½ è¿å¯ä»¥æ ¹æ®éè¦æ´æ°ç¨æ·çé¢ï¼å¦æ·»å ä¸ä¸ªæå
¥æ è®°æä½¿ç¨é«äº®æ¾ç¤ºã对äºç®åçé«äº®æ¾ç¤ºï¼ä½ å¯ä»¥å¨æ¾ç½®ç®æ ä¸ä½¿ç¨ -moz-drag-over
CSS 伪类ã
.droparea:-moz-drag-over {
border: 1px solid black;
}
å¨è¿ä¸ªä¾åä¸ï¼å½å¸¦æ droparea
ç±»çå
ç´ æ¯ä¸ä¸ªææçæ¾ç½®ç®æ æ¶ï¼å³å¨è¯¥å
ç´ ç dragenter
äºä»¶ä¸è°ç¨ preventDefault()
æ¹æ³æ¶ï¼å
ç´ ä¼åºç°ä¸ä¸ª 1 åç´ çé»è²è½®å»ã
夿³¨ï¼ è¦ä½¿è¿ä¸ªä¼ªç±»çæï¼ä½ å¿
é¡»å¨ dragenter
äºä»¶ä¸è°ç¨ preventDefault()
æ¹æ³ï¼å 为è¿ä¸ªä¼ªç±»ç¶æä¸ä¼æ£æ¥ dragover
äºä»¶ï¼è¯è
注ï¼å³å¨ dragover
äºä»¶ä¸è°ç¨ preventDefault()
æ¹æ³ä¹ä¸ä¼ä½¿ä¼ªç±»çæï¼å°½ç®¡è¿ä¸ªä¼ªç±»å«åâ-moz-drag-overâï¼ã
å¯¹äºæ´å¤æçè§è§ææï¼ä½ å¯ä»¥å¨ dragenter
äºä»¶ä¸æ§è¡å
¶ä»æä½ãä¾å¦å¨æ¾ç½®ä½ç½®æå
¥ä¸ä¸ªå
ç´ ï¼è¿æ ·çå
ç´ å¯ä»¥è¡¨ç¤ºä¸ä¸ªæå
¥æ è®°ï¼æè¡¨ç¤ºè¢«ææ½çå
ç´ ç§»å¨å°äºæ°ä½ç½®ã为æ¤ä½ å¯ä»¥å¨ dragenter
äºä»¶ä¸å建ä¸ä¸ªæ°å
ç´ ï¼ç¶åå°å
¶æå
¥å°ææ¡£ä¸ã
dragover
äºä»¶å¨é¼ æ æåçå
ç´ ä¸è§¦åãèªç¶ï¼ä½ å¯è½éè¦å°æå
¥æ è®°ç§»å¨å°äºä»¶åççä½ç½®éè¿ãä½ å¯ä»¥ä½¿ç¨äºä»¶ç clientX
å clientY
屿§ï¼è¿æå
¶ä»é¼ æ äºä»¶ç屿§æ¥ç¡®å®é¼ æ çä½ç½®ã
æåï¼dragleave
äºä»¶ä¼å¨ææ½ç¦»å¼å
ç´ æ¶å¨è¯¥å
ç´ ä¸è§¦åãè¿æ¯ç§»é¤æå
¥æ è®°æé«äº®çå¥½æ¶æºãä½ ä¸éè¦åæ¶è¿ä¸ªäºä»¶ï¼è¯è
注ï¼å³ä¸éè¦ä½¿ç¨ preventDefault()
ï¼ãä½¿ç¨ -moz-drag-over
伪类设置çé«äº®æå
¶ä»è§è§ææä¼è¢«èªå¨ç§»é¤ãå³ä½¿ææ½è¢«åæ¶äºï¼dragleave
äºä»¶ä¹ä¼ç
§å¸¸è§¦åï¼æä»¥ä½ å¯ä»¥ç¡®ä¿å¨è¿ä¸ªäºä»¶ä¸å¯¹ä»»ä½æå
¥æ è®°çæ¸
餿ä½é½ä¸å®å¯ä»¥å®æã
å½ç¨æ·æ¾å¼é¼ æ ï¼ææ¾æä½å°±ä¼ç»æã
妿卿æçæ¾ç½®ç®æ å
ç´ ï¼å³åæ¶äº dragenter
æ dragover
çå
ç´ ï¼ä¸æ¾å¼é¼ æ ï¼æ¾ç½®ä¼æåå®ç°ï¼drop
äºä»¶å¨ç®æ å
ç´ ä¸è¢«è§¦åãå¦åï¼ææ½ä¼è¢«åæ¶ï¼ä¸ä¼è§¦å drop
äºä»¶ã
å¨ drop
äºä»¶ä¸ï¼ä½ åºè¯¥ååæ¾ç½®çæ°æ®å¹¶å°å
¶æå
¥å°æ¾ç½®çä½ç½®ãä½ å¯ä»¥ä½¿ç¨ dropEffect
屿§æ¥ç¡®å®éè¦åªç§ææ½æä½ã
å¨ææææ½æä½ç¸å
³çäºä»¶ä¸ï¼äºä»¶ç dataTransfer
屿§ä¼ä¸ç´ä¿åçææ½æ°æ®ãå¯ä½¿ç¨ getData()
æ¹æ³æ¥ååæ°æ®ã
function onDrop(event) {
const data = event.dataTransfer.getData("text/plain");
event.target.textContent = data;
event.preventDefault();
}
getData()
æ¹æ³æ¥æ¶ä¸ä¸ªåæ°ï¼ååæ°æ®çç±»åãè¿ä¸ªæ¹æ³ä¼è¿åææ½æä½å¼å§æ¶è°ç¨ setData()
æ¹æ³è®¾ç½®çå符串å¼ã妿ä¸åå¨ä¼ å
¥ç±»åçæ°æ®ï¼åä¼è¿å空å符串ãèªç¶ï¼ä½ åºè¯¥ç¥éåªç§ç±»åçæ°æ®å¯ç¨ï¼å 为ä¹åä½ åºè¯¥å·²ç»å¨ dragover
äºä»¶ä¸æ£æ¥è¿æ°æ®ç±»åäºã
å¨ä¸é¢çä¾åä¸ï¼æä»¬ä¸ååæ°æ®å°±æå®ä½ä¸ºææ¬å
容æå
¥å°ç®æ ä¸ãå®é
ææå°±æ¯ææ½ææ¬è¢«æå
¥å°æ¾ç½®ä½ç½®ï¼å设æ¾ç½®ç®æ æ¯ææ¬åºåï¼ä¾å¦ p
æ div
å
ç´ ã
å¨ä¸ä¸ªç½é¡µä¸ï¼å¦æä½ æ³æ¥æ¶ä¸ä¸ªæ¾ç½®ï¼ä¸æ³è®©æµè§å¨çé»è®¤å¤çç¨åºå¤çæ¾ç½®æ°æ®ï¼ä½ åºè¯¥è°ç¨äºä»¶ç preventDefault()
æ¹æ³ãä¾å¦ï¼å½ææ½ä¸ä¸ªé¾æ¥å°ç½é¡µæ¶ï¼Firefox 伿å¼è¿ä¸ªé¾æ¥ãèä½ å¯ä»¥éè¿åæ¶äºä»¶æ¥é»æ¢è¿æ ·çè¡ä¸ºã
ä½ å¯ä»¥ååå
¶ä»ç±»åçæ°æ®ãå¦ææ°æ®æ¯ä¸ä¸ªé¾æ¥ï¼å
¶ç±»ååºä¸º text/uri-list
ãä½ å¯ä»¥å°é¾æ¥æå
¥å°å
容ä¸ã
function doDrop(event) {
const lines = event.dataTransfer.getData("text/uri-list").split("\n");
lines
.filter((line) => !line.startsWith("#"))
.forEach((line) => {
const link = document.createElement("a");
link.href = line;
link.textContent = line;
event.target.appendChild(link);
});
event.preventDefault();
}
è¿ä¸ªä¾åä½¿ç¨ææ½æ°æ®æå
¥é¾æ¥ã顾åæä¹ï¼text/uri-list
ç±»åå¯å
å«ä¸ä¸ª URL åè¡¨ï¼æ¯è¡ä¸ä¸ª URLãå¨ä¸è¿°ä»£ç ä¸ï¼æä»¬ä½¿ç¨ split æ¹æ³å°å符串æè¡åå²ï¼ç¶åè¿ä»£åè¡¨çæ¯ä¸è¡ï¼å°æ¯ä¸ä¸ªé¾æ¥é½æå
¥å°ææ¡£ä¸ã注æå°æä»¬è·³è¿äºäºå·ï¼#ï¼å¼å¤´ç龿¥ï¼å 为é£äºåªæ¯æ³¨éã
å¨ç®åçæ
åµä¸ï¼ä½ å¯ä»¥ä½¿ç¨ä¸ä¸ªç¹å«çç±»å URL
æ¥ååå表ä¸ç¬¬ä¸ä¸ªææç URLãä¾å¦ï¼
var link = event.dataTransfer.getData("URL");
è¿æ ·å°±ä¸éè¦æ£æ¥æ³¨éæè è¿ä»£æ¯ä¸è¡äºãä½è¿æ ·å°±åªè½ååå表ä¸ç第ä¸ä¸ª URLã
URL
ç±»åæ¯ä¸ä¸ªç¹å«çç±»åï¼åªä½ä¸ºç®åç±»åï¼ä¸å¨ types
屿§è§å®çç±»åå表ä¸åºæ¥ã
ææ¶ä½ å¯è½æ¯æä¸åçæ ¼å¼ï¼èä½ å¸æååæ°æ®çæ ¼å¼æ¯æ¯ææ ¼å¼ä¸æå ·ä½çä¸ç§ãå¨è¿ä¸ªä¾åä¸ï¼æ¾ç½®ç®æ æ¯æä¸ç§æ ¼å¼ã
ä¸é¢çä¾åè¿åæ ¼å¼æ¯ææä½³çæ°æ®ï¼
function doDrop(event) {
const supportedTypes = [
"application/x-moz-file",
"text/uri-list",
"text/plain",
];
const types = event.dataTransfer.types.filter((type) =>
supportedTypes.includes(type),
);
if (types.length) {
const data = event.dataTransfer.getData(types[0]);
}
event.preventDefault();
}
å®æææ½
䏿¦ææ½å®æï¼dragend
äºä»¶ä¼å¨ææ½æºå¤´ï¼å³è§¦å dragstart
çå
ç´ ï¼ä¸åçãæ è®ºææ½æ¯æåè¿æ¯è¢«åæ¶ï¼è¿ä¸ªäºä»¶é½ä¼è¢«è§¦åãç¶èï¼ä½ å¯ä»¥ä½¿ç¨ dropEffect
屿§æ¥å³å®æ§è¡ä»ä¹æ¾ç½®æä½ã
å¦æå¨ dragend
äºä»¶ä¸ï¼dropEffect
屿§å¼ä¸º none
ï¼åææ½ä¼è¢«åæ¶ãå¦åï¼è¿ä¸ªå±æ§ä¼è§å®éè¦æ§è¡ä»ä¹æä½ãæºå¤´å
ç´ å¯ä½¿ç¨è¿ä¸ªä¿¡æ¯ä»¥å¨ææ½æä½å®æåä»åæ¥çä½ç½®ç§»é¤è¢«ææ½ç项ç®ãmozUserCancelled
屿§ä¼å¨ç¨æ·åæ¶ææ½ï¼æä¸ Esc é®ï¼æ¶è®¾ç½®ä¸º trueï¼å¨ææ½å 为å
¶ä»åå 妿 ææ¾ç½®ç®æ çè¢«åæ¶æ¶ï¼æææ½æåæ¶ï¼å设置为 falseã
æ¾ç½®å¯åçå¨åä¸çªå£æå¦ä¸ä¸ªåºç¨ç¨åºä¸ãä¸¤ç§æ
åµé½ä¼è§¦å dragend
äºä»¶ãäºä»¶ç screenX
å screenY
屿§ä¼è¢«è®¾ç½®ä¸ºæ¾ç½®åçæ¶é¼ æ å¨å±å¹ä¸çåæ ã
dragend
äºä»¶ç»æåï¼æ´ä¸ªææ¾æä½å°±å®æäºã
[1] å¨ Gecko å
æ ¸ä¸ï¼å¦ææºå¤´èç¹å¨ææ½è¿ç¨ä¸ï¼å¦æ¾ç½®æ dragover
ä¸ï¼è¢«ç§»å¨æç§»é¤äºï¼åä¸ä¼è§¦å dragend
äºä»¶ãåè§ bug 460801ã
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