2012-08-15 23 views
28

Javascriptでは、ユーザーのコンピュータからのファイルアップロードを受け入れるドロップターゲット&を設定する方法を知っています。別のウェブサイトからドラッグされた画像を受け入れるドロップターゲットを設定するにはどうすればよいですか?私が知る必要があるのは、ドラッグした画像のURLです。別のブラウザウィンドウから画像のドラッグ&ドロップを受け入れる

Google Docsは他のウェブサイトから画像を受け入れることができるので、これは可能です。どのように彼らはそれをやっているのか?

答えて

31

あなたがドロップゾーン定義することができます。

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

をしてからdragenterdragexitdragoverdropイベントハンドル:それは私たちがしていることdropイベントハンドラ内で

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); 
} 

dataTransferオブジェクトから画像データをテキストとして読み込みます。他のウェブページから画像をドロップした場合、このテキストは画像のURLを表します。

ここにはlive demoがあります。


UPDATE:

WindowsやMacOSの上のクロムとの間に差異があるように見えます。 WindowsではdataTransfer.getData('Text');が動作しますが、MacOSでは動作しません。 dataTransfer.getData('URL');は両方で動作するはずです。

+0

これは、Chrome – Duopixel

+0

@Duopixelで空白の文字列を警告しています。これは非常に奇妙です。それは私のために働く:Chrome 21.0、Windows 7 64ビット。あなたはどのOSを使用していますか?それはFFで動作しますか? –

+0

Chrome 21 MacOS 10.7.4。おそらく他のMacOSユーザーが誰でも確認できますか?それはFirefoxで動作します。 – Duopixel

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

+2

ドラッグされた画像がリンクである場合、画像URLの代わりにリンクURL(Chrome/Macの場合)または空の文字列(Safari/Macの場合)を通知するときには機能しません。 – haynar

2

一部のブラウザでは、一部の使用text/htmlのテキスト/プレーンを使用するだけでなく

このコードは、MacやPC上で最新のクロム、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 ");'は非常に便利です。あなたよりもずっと... –

4

あなたが別のWebサイトから画像をドラッグ&ドロップを受け入れることができるですが、あなたはそれのいずれかの処理を行うことができない(例えばキャンバスを使用した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; 
      } 
     } 
    } 

Googleでさえ、この問題を回避することはできません - Gmailを使用する場合は、ドラッグ&ドロップ画像を別の場所から電子メールの本文にではなく、このすべてはありませんすることができ、そのsrcセットで<img/>要素を作成していますurl(上記のコードから)。

しかし、私はあなたがそれをクロスオリジンのドラッグアンドドロップで偽装することを可能にするプラグインを作成しました。 PHPバックエンドが必要です。

https://coderwall.com/p/doco6w/html5-cross-origin-drag-and-dropにここ

+0

クロスプラットフォームの問題だけでなく、URLの取得を妨げる可能性もあります。 – Michael

0

を、私はそれに書いた記事を読むここで問題に私のソリューションです:Dropzone js - Drag n Drop file from same page

から画像をドラッグする機能別のドメインが自分のCORSの設定に依存していることを覚えておいてください。

関連する問題