ここにチャイムするだけで、これも数日前にやっています。 jQueryを使ってドロップイベントをバインドする場合は、event.dataTransfer
オブジェクトにアクセスする必要があります。これは、jQueryによって提供されたイベントのevent.originalEvent
オブジェクトを通過する必要があります。
例:これはデフォルトのアクションを実行するのを防止する必要があったとして、私は、両方のdragover
だけでなくdrop
などのイベントに結合し、この中
(ここで見つけることソリューション:Prevent the default action. Working only in chrome)
$('#dropzone').bind('dragover drop', function(event) {
event.stopPropagation();
event.preventDefault();
if (event.type == 'drop') {
console.log(event.originalEvent.dataTransfer.files);
}
});
また、console.log()
event.dataTransfer
(またはevent.originalEvent.dataTransfer
)のファイル配列が空の場合、ここで指摘されているバグがあるようです:event.dataTransfer.files is empty when ondrop is fired?
は、より良い(私はそれの残りの部分に気づいた、と私はそれが古いです知っているが、いくつかのいずれかがこの便利を見つけるかもしれない)のOPの質問に答えるために:
私の実装では、jQueryのであるので、私はそれは大丈夫だ願っています:
var files = [];
// Attaches to the dropzone to pickup the files dropped on it. In mine this is a div.
$("#dropzone").bind('dragover drop', function(event) {
// Stop default actions - if you don't it will open the files in the browser
event.stopPropagation();
event.preventDefault();
if (e.type == 'drop') {
files.push(event.originalEvent.dataTransfer.files);
}
});
// Attach this to a an input type file so it can grab files selected by the input
$("#file-input").bind('change', function(event) {
files.push(event.target.files);
});
// This is a link or button which when clicked will do the ajax request
// and upload the files
$("#upload-button").bind('click', function(event) {
// Stop the default actions
event.stopPropagation();
event.preventDefault();
if (files.length == 0) {
// Handle what you want to happen if no files were in the "queue" on clicking upload
return;
}
var formData = new FormData();
$.each(files, function(key, value) {
formData.append(key, value);
});
$.ajax({
url: 'upload-ajax',
type: 'POST',
data: formData,
cache: false,
dataType: 'json',
processData: false, // Don't process the files - I actually got this and the next from an SO post but I don't remember where
contentType: false, // Set content type to false as jQuery will tell the server its a query string request
success: function(data, textStatus, jqXHR) { /* Handle success */ },
error: function(jqXHR, textStatus, errorThrown) { /* Handle error */ }
});
});
ドロップゾーンのフェードインを見せるように(私のライブラリのToDoリストに表示されるように)、エフェクトを実行するための受け入れられた回答の他のイベントにバインドすることもできます。これは私が使用している実際のAjaxファイルのアップロードの中核です。
私は本当にそれをテストする便利な方法はありませんが、それは本質的にどのように行ったのですか(私は基本的に私が作ったライブラリからすべてのコードを取り出し、ここではわかりやすい方法で)。うまくいけば、これはいくつかの人々を助ける。ここから始めて、ファイルキューのリストを追加してキューからファイルを削除することは実際には本当に簡単なので、これはかなり良い出発点になるはずです。
HTML5をサポートしているブラウザのみがこれを行うことができると思います。私は100%確実ではない。 – JesseBuesking
ホストされた画像(ウェブサイトから)をドラッグしてドロップイベントを持つdivにドロップした後、画像へのパスを取得したり、画像を作成したりするなど、ネイティブのjavascriptを使用してドラッグアンドドロップでかなりクールなことをすることができますそのパスをそのソースとして持つイメージ要素しかし、デスクトップから画像をドラッグすることは、まったく別のことであり、ブロックされる可能性はさらに高くなります。 –