2012-08-15 77 views
28

在Javascript中,我知道如何设置拖放目标,该目标接受来自用户计算机的文件上传。如何设置放置目标,以接受从其他网站拖动的图像?我只需要知道他们拖动的图片的网址。接受从另一个浏览器窗口拖放图像

我知道这是可能的,因为Google Docs接受来自其他网站的图片丢弃。任何想法他们如何做?

回答

31

你可以定义一个拖放区:

<div id="dropbox">DropZone => you could drop any image from any page here</div> 

,然后处理dragenterdragexitdragoverdrop事件:

var dropbox = document.getElementById('dropbox'); 

dropbox.addEventListener('dragenter', noopHandler, false); 
dropbox.addEventListener('dragexit', noopHandler, false); 
dropbox.addEventListener('dragover', noopHandler, false); 
dropbox.addEventListener('drop', drop, false); 

function noopHandler(evt) { 
    evt.stopPropagation(); 
    evt.preventDefault(); 
} 
function drop(evt) { 
    evt.stopPropagation(); 
    evt.preventDefault(); 
    var imageUrl = evt.dataTransfer.getData('Text'); 
    alert(imageUrl); 
} 

这是drop事件处理程序,我们都在里面从文字中读取dataTransfer对象的图像数据。如果我们从其他网页中删除图片,则此文字将代表图片的网址。这个是live demo


UPDATE:

它看起来像有在Windows和MacOS浏览器之间的差异。在Windows dataTransfer.getData('Text');工程,但不是在MacOS上。 dataTransfer.getData('URL');应该可以同时工作。

+0

这是在Chrome中提示空白字符串 – Duopixel 2012-08-15 18:09:46

+0

@Duopixel,这很奇怪。它适用于我:Chrome 21.0,Windows 7 64位。你在使用什么操作系统?它是否适用于FF? – 2012-08-15 18:10:54

+0

Chrome 21 MacOS 10.7.4。也许其他MacOS用户可以确认,任何人?它在Firefox中工作。 – Duopixel 2012-08-16 01:20:29

3
function drop(evt) { 
    evt.stopPropagation(); 
    evt.preventDefault(); 
    var imageUrl = evt.dataTransfer.getData('URL'); // instead of 'Text' 
    alert(imageUrl); 
} 

似乎可用于Mac上的Firefox,Safari和Chrome。也适用于Windows中的Firefox,IE和Chrome。

Updated fiddle

+0

什么版本?它在Windows 7上工作,Chrome 21.0.1180.79 – zackdever 2012-08-20 06:11:47

+2

当拖动的图像是链接时它不起作用,它会警告链接网址(在Chrome/Mac上)或空白字符串(在Safari/Mac上)而不是图像网址 – haynar 2012-08-20 06:40:08

2

有些浏览器使用text/plain的一些使用文本/ HTML以及

此代码应拉在Mac和PC的最新的Chrome,FF任何文本或图像源的URL。

Safari似乎没有给出URL,所以如果有人知道如何得到它,让我知道。

我还在IE上工作。

function getAnyText(theevent) { 
//see if we have anything in the text or img src tag 
    var insert_text; 
    var location = theevent.target; 
    var etext; 
    var ehtml; 
    try { 
      etext = theevent.dataTransfer.getData("text/plain"); 
    } catch (_error) {} 
    try { 
      ehtml = theevent.dataTransfer.getData("text/html"); 
    } catch (_error) {} 
    if (etext) { 
      insert_text = etext; 
    } else if (ehtml) { 
      object = $('<div/>').html(ehtml).contents(); 
      if (object) { 
        insert_text = object.closest('img').prop('src'); 
      } 
    } 
    if (insert_text) { 
      insertText(insert_text,location); 
    } 
} 
+0

'theevent.dataTransfer.getData(“text/html”);'非常有用。比你... – 2014-05-24 02:25:56

+0

我发现,如果被拖动的图像包含在元素中,我必须在Firefox上尝试最接近('img')和子元素('img')。 – ChrisFox 2016-10-10 08:51:19

4

虽然你能够接受来自其他网站的图像的拖放,你不能这样做的任何处理(例如用帆布将其转换为一个base64字符串)(如8月21日的2014),因为各种交叉来源的政策问题。

var dt = event.dataTransfer; 
var url = dt.getData('url'); 
if (!url) { 
    url = dt.getData('text/plain'); 
    if (!url) { 
     url = dt.getData('text/uri-list'); 
      if (!url) { 
       // We have tried all that we can to get this url but we can't. Abort mission 
       return; 
      } 
     } 
    } 

即使谷歌不解决这个问题 - 如果你使用Gmail,您可以将它从另一个位置在电子邮件主体掉落的图像,但是这一切都与它src集创建<img/>元素到url(来自上面的代码)。

但是,我已经创建了一个插件,可以让您伪造它跨越原点的拖放。它需要一个PHP后端。

阅读我就可以在这里写下https://coderwall.com/p/doco6w/html5-cross-origin-drag-and-drop

+0

似乎不仅跨平台问题可以阻止您检索URL,而且还会混合内容。 – Michael 2016-02-06 19:15:48