2013-04-05 4 views
31

ドラッグアンドドロップのためにjavascriptのevent.dataTransferを使ってネイティブオブジェクトを渡す方法を理解しようとしています。私はCMSのフロントエンドエディタの部分を書いています。ユーザーが要素(ファイルから画像、HTMLのスニペット、まさにあらゆるものまでさまざまな種類の要素)をドラッグ&ドロップできるようにしたいと考えています。だから私は実際のオブジェクトを渡したいので、それをレンダリングする方法を知るために必要なことを指定するためにデータを添付することができます。dataTransferでオブジェクトを渡す

jQueryの.data()を使用してページ上のオブジェクトにオブジェクトをアタッチし、セレクタ文字列をsetDataに渡すだけですが、特にそのハックは楽しめません。

これは、jQuery UIのドラッグ可能/ドロップ可能で解決できる可能性があります(そして私は完全にライブラリを使用することに反対していません)が、dropzoneはiframe内にあるので、これは実際には最新のjQuery UI (1.10.2)。また、可能であればネイティブで行うことを強くお勧めします。このアプリにはすでに十分なライブラリがあります。これが失敗した理由を今すぐhttp://jsfiddle.net/AHnh8/

var foo = {foo: "foo", bar: "bar"}; 

$dragme.on("dragstart", function(e) { 
    e.originalEvent.dataTransfer.setData("foo", foo); 
}); 

$dropzone.on("dragenter", function(e) { e.preventDefault(); }); 
$dropzone.on("dragover", function(e) { e.preventDefault(); }); 
$dropzone.on("drop", function(e) { 
    console.log(e.originalEvent.dataTransfer.getData("foo")); // [Object object] 
    console.log(typeof e.originalEvent.dataTransfer.getData("foo")); // string 
}); 

は、スペックを読んだ後、私は完全に理解して:

は、ここで問題です。私が理解できないことは、最終的に私が望むものを達成する方法です。あなたは、文字列のみを保存することができますので、

おかげ

+0

は、私はあなただけ受信したときにそれとJSON.parseデータを送信する前にデータを文字列化する必要があると思います。 – Deee

答えて

36

あなたがsetDataを使用する前にJSON.stringifyにオブジェクトを渡す必要があります。

var j = JSON.stringify(foo); 
e.originalEvent.dataTransfer.setData("foo", j); 

そして、あなたがオブジェクトに文字列を再変換する必要が他の方法でラウンド:そうならば

var obj = JSON.parse(e.originalEvent.dataTransfer.getData("foo")); 
console.log("foo is:", obj); 

は、私は(フィドル

+2

私は投稿した後もこれを検討していましたが、オブジェクトを渡す方法があるはずですがまだ気付いていますか? – sarink

+1

私は道があるとは思わない。データを格納するグローバル配列を追加してから、そのキーを 'set/getData'に渡すだけで済みます。多分もっと大きなオブジェクトのほうが速いかもしれません –

+1

私は最初の質問でその考えを提案しました。実際のオブジェクトを何らかの形で渡す方法があると本当に望んでいました。それはドラッグアンドドロップ仕様に含まれていないと奇妙に思える。私はちょうどstringifyまたはグローバル配列のために解決すると思います... – sarink

2

作業thisはたぶん私が提案しようとしています何が間違っている参照してください。理由を聞いてうれしいです)。たとえば、あなたが必要なものを参照するためにはdragstartリスナーに変数を設定しないのはなぜ :

//global variable 
var obj; 

//set the global variable to wahtever you wish in the dragstart: 
$dragme.on("dragstart", function(e) { 
    obj = foo; 
    //or even obj = document.getElementById("some element's id"); 
}); 

//use this obj in the drop listener. 
$dropzone.on("drop", function(e) { 
    obj.doWahtEver(); 
}); 
+3

bc globals = :(..このような些細な回避策がたくさんあります。もともと、私はあなたがdataTransferでオブジェクトを渡すことができるかどうかを知りたいので、質問を投稿しました。あなたはできないことが分かります。 – sarink

+0

@ Kabir、それはもっと正しい方法ですし、ドキュメントのシリアル化/逆シリアル化は、データのfromatがhttps://developer.mozilla.org/en-US/docs/Web/API/DOMStringであることを確認できるはずです。 – 2oppin

関連する問題