Saya menambahkan html5 drag and drop uploader ke halaman saya.
Saat file dijatuhkan ke area unggahan, semuanya berfungsi dengan baik.
Namun, jika saya secara tidak sengaja menjatuhkan file di luar area unggahan, browser memuat file lokal seolah-olah itu adalah halaman baru.
Bagaimana saya bisa mencegah perilaku ini?
Terima kasih!
javascript
jquery
html
drag-and-drop
Travis
sumber
sumber
Jawaban:
Anda dapat menambahkan pendengar acara ke jendela yang memanggil
preventDefault()
semua aktivitas dragover dan drop.Contoh:
sumber
dragover
dandrop
penangan diperlukan untuk mencegah browser memuat file yang dijatuhkan. (Chrome terbaru 2015/08/03). Solusinya bekerja pada FF terbaru juga.<input type="file" />
. Penting untuk memeriksa apakahe.target
input file dan membiarkan peristiwa seperti itu lewat.Setelah banyak mengutak-atik, saya menemukan ini menjadi solusi paling stabil:
Pengaturan keduanya
effectAllow
dandropEffect
tanpa syarat pada jendela menyebabkan zona drop saya tidak lagi menerima dnd, terlepas dari apakah properti disetel baru atau tidak.sumber
Untuk jQuery jawaban yang benar adalah:
Di sini
return false
akan berperilaku sebagaievent.preventDefault()
danevent.stopPropagation()
.sumber
Untuk mengizinkan seret-dan-jatuhkan hanya pada beberapa elemen, Anda bisa melakukan sesuatu seperti:
sumber
coba ini:
sumber
Mencegah semua operasi seret dan lepas secara default mungkin bukan yang Anda inginkan. Mungkin untuk memeriksa apakah sumber seret adalah file eksternal, setidaknya di beberapa browser. Saya telah menyertakan fungsi untuk memeriksa apakah sumber seret adalah file eksternal dalam jawaban StackOverflow ini .
Memodifikasi jawaban Digital Plane, Anda dapat melakukan sesuatu seperti ini:
sumber
e || event;
? Di manaevent
didefinisikan? Lupakan. Sepertinya itu adalah objek global di IE? Saya menemukan kutipan ini, di"In Microsoft Visual Basic Scripting Edition (VBScript), you must access the event object through the window object."
siniDalam pengalaman saya, masalah ini pertama kali muncul ketika Anda menambahkan fungsionalitas penurunan file ke halaman. Karena itu pendapat saya adalah komponen yang menambahkan ini, juga harus bertanggung jawab untuk mencegah drop di luar drop zone.
Dalam solusi saya zona penurunan adalah input dengan kelas, tetapi pemilih yang tidak ambigu berfungsi.
Pendengar ditambahkan / dihapus secara otomatis ketika komponen dibuat / dihancurkan, dan komponen lainnya yang menggunakan strategi yang sama pada halaman yang sama tidak saling mengganggu karena StopPropagation ().
sumber
Untuk membangun metode "periksa target" yang dijabarkan dalam beberapa jawaban lain, berikut adalah metode yang lebih umum / fungsional:
Disebut seperti:
sumber
function preventDefaultExcept(...predicates){}
. Dan kemudian gunakan sepertipreventDefaultExcept(isDropzone, isntParagraph)
Saya memiliki HTML
object
(embed
) yang mengisi lebar dan tinggi halaman. Jawaban oleh @ digital-plane berfungsi pada halaman web normal tetapi tidak jika pengguna menjatuhkan ke objek tertanam. Jadi saya butuh solusi berbeda.Jika kita beralih ke menggunakan fase penangkapan acara, kita bisa mendapatkan peristiwa sebelum objek tertanam menerimanya (perhatikan
true
nilai di akhir panggilan pendengar acara):Dengan menggunakan kode berikut (berdasarkan jawaban @ digital-plane), halaman menjadi target seret, mencegah embed objek menangkap peristiwa dan kemudian memuat gambar kami:
Diuji pada Firefox pada Mac.
sumber
Saya menggunakan pemilih kelas untuk beberapa area unggahan sehingga solusi saya mengambil bentuk yang kurang murni ini
Berdasarkan jawaban Axel Amthor, dengan ketergantungan pada jQuery (alias $)
sumber