HTML5 拖放 - Firefox 被重定向

Posted

技术标签:

【中文标题】HTML5 拖放 - Firefox 被重定向【英文标题】:HTML5 Drag and Drop - Firefox is being redirected 【发布时间】:2013-01-10 14:17:40 【问题描述】:

我正在尝试在我的应用中实现 html5 的拖放功能,但 Firefox 总是被重定向到拖放图像的源。我正在使用e.stopPropagation()。在 Chromium 中,一切都按预期工作。奇怪的... 代码如下:

<html>
 <head>
  <meta charset="utf-8" />
  <title>DuOS 0.0.0</title>
  <meta name="author" content="Jan Durrer, Michal Grňo" />
  <link rel="stylesheet" href="./default.css" />
 </head>
 <body>
  <script src="./boot.js"></script>
  <script src="./window.js"></script>
  <script src="./omnibox.js"></script>
  <section class="desktop">
   <img class="icon" id="computer" style="left: 0px; top: 340px;" src="./image/icon/system/computer.png" />
   <img class="icon" id="folder" style="left: 0px; top: 170px;" src="./image/icon/system/documents.png" />
   <img class="icon" id="bin" style="left: 0px; top: 0px;" src="./image/icon/system/bin.png" />
  </section>
  <script>
   window.clickedIcons = Array();
   window.draggedIcon = ;
   window.draggedIcon.offset = Array();
   window.draggedIcon.element = null;

   //Pohybování
   function drag_start(e) 
    window.draggedIcon.element = e.target;
    event.dataTransfer.effectAllowed = 'copyMove';
    event.dataTransfer.setData('text/plain', 'hola'); //hack

    var style = window.getComputedStyle(event.target, null);
    window.draggedIcon.offset[0] = parseInt(style.getPropertyValue("left"),10) - event.clientX; console.log(window.draggedIcon.offset[0]);
    window.draggedIcon.offset[1] = parseInt(style.getPropertyValue("top" ),10) - event.clientY; console.log(window.draggedIcon.offset[1]);
    window.draggedIcon.element = event.target;
   

   function drag_over(e) 
    e.preventDefault();
    return false;
   

   function drop(e) 
    window.draggedIcon.element.style.left = (event.clientX + window.draggedIcon.offset[0]) + 'px';
    window.draggedIcon.element.style.top  = (event.clientY + window.draggedIcon.offset[1]) + 'px';
    window.draggedIcon.element.style.visibility = 'visible';
    window.draggedIcon.element = null;
    if(e.stopPropagation) e.stopPropagation();
    return false;
   
   var xresult = document.evaluate('//body/*[@class="desktop"]/*[@class="icon"]', document, null, XPathResult.ANY_TYPE, null);
   var dm = xresult.iterateNext();
   while (dm) 
    dm.addEventListener('dragstart',drag_start,false);
    dm.addEventListener('click',click,false);
    dm = xresult.iterateNext();
   

   document.body.addEventListener('dragover',drag_over,true);
   document.body.addEventListener('drop',drop,true);
  </script>
 </body>
</html>

感谢您的帮助,m93a。

【问题讨论】:

【参考方案1】:

你需要prevent the default action:

function drop(e) 
    if(e.preventDefault)  e.preventDefault(); 
    if(e.stopPropagation)  e.stopPropagation(); 
    window.draggedIcon.element.style.left = (event.clientX + window.draggedIcon.offset[0]) + 'px';
    window.draggedIcon.element.style.top  = (event.clientY + window.draggedIcon.offset[1]) + 'px';
    window.draggedIcon.element.style.visibility = 'visible';
    window.draggedIcon.element = null;
    return false;

【讨论】:

谢谢,你真的帮了我:D preventDefault 完成了这项工作!但是有人可以解释一下为什么 drop 会在 Firefox 上触发重定向吗?? @MatthieuRiegler 疯狂猜测:将文件放入 Firefox 会导航到该文件,这就是默认导航到要删除的 URL 的原因。就我而言,drag 之前曾调用过event.dataTransfer.setData('text/plain', "css"),FF 尝试打开 URL "css"

以上是关于HTML5 拖放 - Firefox 被重定向的主要内容,如果未能解决你的问题,请参考以下文章

Firefox html5拖放不起作用

Firefox 中的 HTML5 拖放文件夹检测。甚至可能吗?

使用 HTML5 拖放防止拖动事件干扰 Firefox 中的输入元素

将任何子域重定向到主域上的页面

H5 拖放

跨浏览器 HTML5 拖放 JSON 数据传输失败