è¤æ°ã®ã¢ã¤ãã ã®ãã©ãã° & ãããã
è¦å: moz ã®æ¥é è¾ãã¤ããã¡ã½ãããããããã£ï¼mozSetDataAt() ãªã©ï¼ã¯ Gecko åºæã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ãããããã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¯ Gecko ãã¼ã¹ã®ãã©ã¦ã¶ã¼ã§ããåä½ãã¾ããã
Mozilla ã¯ããã¤ãã®æ¨æºå¤ã®æ©è½ã使ç¨ãããè¤æ°ã®ã¢ã¤ãã ã®ãã©ãã°ãã§ããæ©è½ã«å¯¾å¿ãã¦ãã¾ãããã㯠types ããããã£ã¨ãåæ§ã« getData(), setData(), clearData() ã¡ã½ãããåæ ãããã®ã§ãããåå¾ãä¿®æ£ãåé¤ããã¢ã¤ãã ã®ä½ç½®ãæå®ãã追å ã®å¼æ°ãåãã¾ãã
ãã®è¨äºã§èª¬æãããã©ãã°å¦çã¯ã DataTransfer ã¤ã³ã¿ã¼ãã§ã¤ã¹ãå©ç¨ãã¾ãï¼ãã®å¦ç㯠DataTransferItem ã¤ã³ã¿ã¼ãã§ã¤ã¹ããã³ DataTransferItemList ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¯ä½¿ç¨ãã¾ããã
ä½ç½®ã使ç¨ããè¨å®ããã³åå¾
mozSetDataAt() ã¡ã½ããã§ã dragstart ã¤ãã³ãã®éã«
è¤æ°ã®ã¢ã¤ãã ã追å ãããã¨ãã§ãã¾ãããã㯠setData() ã¨ä¼¼ã¦ãã¾ãã
const dt = event.dataTransfer;
dt.mozSetDataAt("text/plain", "ãã©ãã°ããããã¼ã¿", 0);
dt.mozSetDataAt("text/plain", "ãã©ãã°ããã 2 ã¤ç®ã®ãã¼ã¿", 1);
ãã®ä¾ã§ã¯ 2 ã¤ã®ãã©ãã°ã¢ã¤ãã ã追å ãã¦ãã¾ããæå¾ã®å¼æ°ã¯è¿½å ããã¢ã¤ãã ã®ä½ç½®ã示ãã¦ãã¾ãããããã®ã¢ã¤ãã 㯠0 çªããé çªã«ç»é²ããå¿
è¦ããããæå¾ã®æ¹ï¼ä½ç½®ã®å¤§ããªãã®ï¼ããéé ã«ç»é²ãããã¨ã¯ã§ãã¾ãããã¾ãããã§ã«ãã¼ã¿ãç»é²ããã¦ããä½ç½®ãæå®ãã¦ããä¸åº¦ãã¼ã¿ãç»é²ããã¨ãåã«ç»é²ãããã¼ã¿ãç½®ãæãããã¨ãã§ãã¾ããä½ç½®ã¨ã㦠0 ãæå®ããã¨ã setData() ãå¼ã³åºããã¨ã¨åçã«ãªãã¾ãã
ã¢ã¤ãã ãåé¤ããã«ã¯ã mozClearDataAt() ã¡ã½ããã使ç¨ãã¾ãã
event.dataTransfer.mozClearDataAt("text/plain", 1);
注æ: ããä½ç½®ã§ç¤ºãããã¢ã¤ãã ã«ã¤ãã¦ãæå¾ã®ãã¼ã¿å½¢å¼ã®åé¤ã«ãã£ã¦ã¢ã¤ãã å ¨ä½ãåé¤ããã¨ãæ®ãã®ã¢ã¤ãã ãç¹°ãä¸ãã£ã¦ã¢ã¤ãã ã®ä½ç½®ãå¤ãããã¨ã«æ³¨æãã¦ãã ãããä¾ãã°ã次ã®ããã®ã³ã¼ããè¦ã¦ãã ããã
const dt = event.dataTransfer;
dt.mozSetDataAt("text/uri-list", "URL1", 0);
dt.mozSetDataAt("text/plain", "URL1", 0);
dt.mozSetDataAt("text/uri-list", "URL2", 1);
dt.mozSetDataAt("text/plain", "URL2", 1);
dt.mozSetDataAt("text/uri-list", "URL3", 2);
dt.mozSetDataAt("text/plain", "URL3", 2);
// [item1] data=URL1, index=0
// [item2] data=URL2, index=1
// [item3] data=URL3, index=2
ãã®ããã« 2 ã¤ã®ç°ãªãå½¢å¼ã«ãã 3 ã¤ã®ã¢ã¤ãã ãç»é²ããå¾ã§ã
dt.mozClearDataAt("text/uri-list", 1);
dt.mozClearDataAt("text/plain", 1);
ãã®ããã« 2 çªç®ã®ã¢ã¤ãã ã«ã¤ãã¦ãã¹ã¦ã®å½¢å¼ã®ãã¼ã¿ãåé¤ããã¨ã 3 çªç®ã ã£ãã¢ã¤ãã ãç¹°ãä¸ãã£ã¦ 2 çªç®ã«ãªããä½ç½®ã 2 ãã 1 ã«å¤ããã¾ãã
// [item1] data=URL1, index=0
// [item2] data=URL3, index=1
幸ããªãã¨ã«ãé常ã¯ã¢ã¤ãã ãåé¤ããå¿ è¦ãããå ´åã¯å¸ã§ãããããããå¿ è¦ã«å¿ãã¦ã¢ã¤ãã ã追å ããã ãã®å ´åã®æ¹ããã£ã¨å¤ãã§ãã
è¤æ°ã®ã¢ã¤ãã ã®ãã©ãã°ã使ãããå ´åã®ä»£è¡¨ä¾ã¯ãè¤æ°ã®ãã¡ã¤ã«ãããã¯ãã¼ã¯ããã©ãã°ããæã§ãããã®å ´åã«ã¯ãé©åãªå½¢å¼ã§ãããã®ã¢ã¤ãã ã追å ãã¦ãã ãããã¾ãå¿ é ã§ã¯ããã¾ããããããããã®ã¢ã¤ãã ã¯å¸¸ã«åãå½¢å¼ã§ãã¼ã¿ã追å ããã¹ãã§ããããã«ãããããã対象ã¯ãä¸è²«ãããã¼ã¿ã®åãåããæå¾ ã§ãã¾ãã
è¤æ°ã®ãã¡ã¤ã«ããã©ãã°ããã¦ãããã©ããã確èªããã«ã¯ã mozItemCount ããããã£ã調ã¹ã¾ãããã®ããããã£ã«ã¯ãã©ãã°ããã¦ããã¢ã¤ãã ã®æ°ãã»ããããã¾ãããããã®ããããå
ã 1 ã¤ã®ã¢ã¤ãã ã®ããããã ããåãä»ããå ´åã«ã¯ããã©ãã°ãããã¢ã¤ãã ãã¹ã¦ãæå¦ãããã¨ãã§ãã¾ãããæåã®ã¢ã¤ãã ã ããåãåããã¨ãã§ãã¾ããè¤æ°ã®ã¢ã¤ãã ã®åãåããæå¦ããã«ã¯ã dragover ã¤ãã³ãããã£ã³ã»ã«ããªããã effectAllowed ããããã£ã« none ãæå®ãã¾ããä»ã®ã¤ãã³ããªã¹ãã¼ããã§ã«ã¤ãã³ãããã£ã³ã»ã«ãã¦ããå ´åã«åãã¦ã両æ¹ãå®è¡ãã¦ãæ§ãã¾ããã
ãããããããã¢ã¤ãã ã®ãã¡æåã®ã¢ã¤ãã ã ããæ±ãå ´åã¯ã 1 ã¤ã ãã®ã¢ã¤ãã ã®ãã©ãã°ã®å ´åã¨åæ§ã« getData() ã使ãã¾ããããã¯ãä½ã追å ã®å¦çãå¿
è¦ãªãããããã¢ã¤ãã ã1ã¤ã ãåãåããããã対象ã®ããã«æç¨ã§ãã
ããã«å¯¾ãã¦ãä»»æã®ä½ç½®ã®ã¢ã¤ãã ããã¼ã¿ãã©ã³ã¹ãã¡ã¼ããåå¾ããã«ã¯ mozGetDataAt() ã¡ã½ããã使ãã¾ãã以ä¸ã®ä¾ã¯ããã©ãã°ããããã¡ã¤ã«ãåå¾ããããããé
åã«è¿½å ãããã®ã§ãã
function onDrop(event) {
const files = [];
const dt = event.dataTransfer;
for (let i = 0; i < dt.mozItemCount; i++)
files.push(dt.mozGetDataAt("application/x-moz-file", i));
}
mozTypesAt ã¡ã½ããã使ã£ã¦ãæãã§ããå½¢å¼ã®ãã¼ã¿ãåå¨ãã¦ãããã©ããã確ãããããªãããããã¾ããã types ããããã£ã¨åæ§ã«ããã®ã¡ã½ããã¯ããã®ã¢ã¤ãã ãä¿æãã¦ãããã¼ã¿ã®åã®æååãè¿ãã¾ãã types ããããã£ãåå¾ããäºã¯ãä½ç½®ã 0 ã®ã¢ã¤ãã ã®åã®ãªã¹ããåå¾ããäºã«çãããªãã¾ãã
const types = event.dataTransfer.mozTypesAt(1);
æååã§ãªããã¼ã¿ã®ãã©ãã°
ä¸ã§è§£èª¬ãã追å ã®ã¡ã½ãããæ±ãããã¼ã¿ã¯æååã«éå®ããããã©ããªç¨®é¡ã®ãã¼ã¿ã§ãæå®ãããã¨ãã§ãã¾ããä¾ãã°ããã¡ã¤ã«ã¯ application/x-moz-file åã§ nsIFile ã®ãªãã¸ã§ã¯ãã¨ãã¦ä¿æããã¦ãã©ãã°ããã¾ãã setData() ã¡ã½ããã¯æååãã対å¿ãã¦ãããã ãã©ãã°ãããã¡ã¤ã«ãæå®ããã®ã«ã¯å©ç¨ã§ããªãããã代ããã« mozSetDataAt() ã¡ã½ããã使ããªãã¦ã¯ãªãã¾ããã
dt.mozSetDataAt("application/x-moz-file", file, 0);
è¤æ°ã®ã¢ã¤ãã ãæ±ãå¿ è¦ããªãå ´åã§ãããã®ã¡ã½ããã使ããã¨ã«ãã£ã¦ä»»æã®ãªãã¸ã§ã¯ãããã¼ã¿ã«æå®ã§ãã¾ãããã®å ´åã«ã¯ãä½ç½®ã¨ã㦠0 ãæå®ãã¦ããã¾ãã
åæ§ã«ããã¡ã¤ã«ããã®ä»ã®ãªãã¸ã§ã¯ããåå¾ããã«ã¯ mozGetDataAt() ã¡ã½ããã使ãå¿
è¦ãããã¾ãããã getData() ã使ã£ãå ´åã¯ãå¤ãæååã§ãªãåã®ãã¼ã¿ã¯ç©ºæåã¨ãã¦åå¾ããã¾ãããã ããæ°å¤ã®ãããªåç´ãªåã®ãã¼ã¿ã«ã¤ãã¦ã¯æååã«å¤æã§ããããããã®å ´å㯠getData() ã使ã£ã¦ãåé¡ããã¾ããã
è¤æ°ã¢ã¤ãã ã®ããããã®ä¾
次ã®ä¾ã§ã¯ãããããããã¢ã¤ãã ã¨ãã©ã¼ãããã®ãªã¹ãã表示ãããããã¯ã¹ãç¨æããã¦ãã¾ãã
<html lang="en">
<head>
<script>
function doDrop(event) {
const dt = event.dataTransfer;
const count = dt.mozItemCount;
output(`Items: ${count}\n`);
for (let i = 0; i < count; i++) {
output(` Item ${i}:\n`);
const types = dt.mozTypesAt(i);
for (let t = 0; t < types.length; t++) {
output(` ${types[t]}: `);
try {
const data = dt.mozGetDataAt(types[t], i);
output(`(${typeof data}) : <${data} >\n`);
} catch (ex) {
output("<<error>>\n");
dump(ex);
}
}
}
}
function output(text) {
document.getElementById("output").textContent += text;
dump(text);
}
</script>
</head>
<body>
<div
id="output"
style="min-height: 100px; white-space: pre; border: 1px solid black;"
ondragenter="document.getElementById('output').textContent = ''; event.stopPropagation(); event.preventDefault();"
ondragover="event.stopPropagation(); event.preventDefault();"
ondrop="event.stopPropagation(); event.preventDefault(); doDrop(event);">
<div>Fix</div>
</div>
</body>
</html>
ãã®ä¾ã§ã¯ã dragenter 㨠ã®ä¸¡ã¤ãã³ãã dragoverpreventDefault() ã¡ã½ããã§ãã£ã³ã»ã«ãã¾ããããã«ãããè¦ç´ ã®ä¸ã§ã®ãããããå¯è½ã«ãªã£ã¦ãã¾ãã
ã¢ã¤ãã ãããããããæã«ã doDrop ã¤ãã³ããã³ãã©ã¼ãå¼ã³åºããã¾ãããã®é¢æ°ã¯ mozItemCount ããããã£ãè¦ã¦ãããã¤ã®ã¢ã¤ãã ããããããããã®ãã調ã¹ããããã«ç¹°ãè¿ãå¦çãè¡ãã¾ããããããã®ã¢ã¤ãã ã«ã¤ãã¦ãåã®ä¸è¦§ãå¾ãããã« mozTypesAt ã¡ã½ãããå¼ã°ãã¾ãããã®ä¸è¦§ã®çæå¦çã¯ããã©ãã°ã«å¯¾ãã¦é¢é£ã¥ãããããã¹ã¦ã®ãã¼ã¿ã«å¯¾ãã¦ç¹°ãè¿ããã¾ãã
ãã®ä¾ã¯ããããã©ãã°æä½ãä¿æãã¦ãããã¼ã¿ã確ããããæã«ä¾¿å©ã§ãããã ã¢ã¤ãã ããã®ä¾ã®ãããã対象ã«ããããããã ãã§ããã©ãã°ãããã©ã®ã¢ã¤ãã ãã©ããªå½¢å¼ã§ã©ã®ãããªãã¼ã¿ãä¿æãã¦ããã®ããè¦ããã¨ãã§ãã¾ãã