Apakah mungkin untuk menghapus <input type='file' />
nilai kontrol dengan jQuery? Saya sudah mencoba yang berikut ini:
$('#control').attr({ value: '' });
Tapi itu tidak berhasil.
Mudah: Anda membungkus <form>
elemen, mengatur ulang panggilan pada formulir, lalu menghapus formulir menggunakan .unwrap()
. Tidak seperti .clone()
solusi yang ada di utas ini, Anda berakhir dengan elemen yang sama di bagian akhir (termasuk properti khusus yang disetel di atasnya).
Diuji dan bekerja di Opera, Firefox, Safari, Chrome dan IE6 +. Juga berfungsi pada tipe elemen elemen lainnya, dengan pengecualian type="hidden"
.
window.reset = function(e) {
e.wrap('<form>').closest('form').get(0).reset();
e.unwrap();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
<input id="file" type="file">
<br>
<input id="text" type="text" value="Original">
</form>
<button onclick="reset($('#file'))">Reset file</button>
<button onclick="reset($('#text'))">Reset text</button>
Seperti yang dicatat Timo di bawah ini, jika Anda memiliki tombol untuk memicu pengaturan ulang bidang di dalam <form>
, Anda harus memanggil .preventDefault()
acara tersebut untuk mencegahnya <button>
memicu pengiriman.
Tidak berfungsi di IE 11 karena bug yang tidak diperbaiki. Teks (nama file) dihapus pada input, tetapi File
daftarnya tetap terisi.
reset()
menjadi misalnya.reset2()
, karena setidaknya di Chrome semua bidang dihapus jika adareset()
. Dan tambahkan event.preventDefault () setelah menghapus panggilan untuk mencegah pengiriman. Cara ini:<button onclick="reset2($('#file'));event.preventDefault()">Reset file</button>
. Contoh kerja: jsfiddle.net/rPaZQ/23 .Jawaban cepat: ganti saja.
Dalam kode di bawah ini saya menggunakan
replaceWith
metode jQuery untuk mengganti kontrol dengan tiruannya sendiri. Jika Anda memiliki penangan yang terikat pada acara di kontrol ini, kami juga ingin mempertahankannya. Untuk melakukan ini, kita masuktrue
sebagai parameter pertama dariclone
metode ini.Fiddle: http://jsfiddle.net/jonathansampson/dAQVM/
Jika kloning, sambil mempertahankan penangan acara, menyajikan masalah yang dapat Anda pertimbangkan menggunakan delegasi acara untuk menangani klik pada kontrol ini dari elemen induk:
Ini mencegah perlunya penangan dikloning bersama dengan elemen ketika kontrol sedang di-refresh.
sumber
input.value = null;
Jquery seharusnya menangani masalah lintas-browser / browser lama untuk Anda.
Ini berfungsi pada browser modern yang saya uji: Chromium v25, Firefox v20, Opera v12.14
Menggunakan jquery 1.9.1
HTML
Jquery
Di jsfiddle
Solusi javascript berikut juga bekerja untuk saya di browser yang disebutkan di atas.
Di jsfiddle
Saya tidak punya cara untuk menguji dengan IE, tetapi secara teoritis ini harus bekerja. Jika IE cukup berbeda sehingga versi Javascript tidak berfungsi karena MS telah melakukannya dengan cara yang berbeda, metode jquery menurut pendapat saya harus menanganinya untuk Anda, kalau tidak, akan lebih baik menunjukkannya kepada tim jquery bersama dengan metode yang dibutuhkan IE. (Saya melihat orang-orang mengatakan "ini tidak akan bekerja pada IE", tetapi tidak ada javascript vanilla untuk menunjukkan cara kerjanya pada IE (seharusnya "fitur keamanan"?), Mungkin melaporkannya sebagai bug ke MS juga (jika mereka mau hitung seperti itu), sehingga diperbaiki dalam rilis yang lebih baru)
Seperti disebutkan dalam jawaban lain, sebuah posting di forum jquery
Tetapi jquery sekarang telah menghapus dukungan untuk pengujian browser, jquery.browser.
Solusi javascript ini juga bekerja untuk saya, itu adalah setara vanilla dari metode jquery.replaceWith .
Di jsfiddle
Yang penting untuk dicatat adalah bahwa metode cloneNode tidak mempertahankan penangan kejadian yang terkait.
Lihat contoh ini.
Di jsfiddle
Tapi jquery.clone menawarkan ini [* 1]
Di jsfiddle
[* 1] jquery dapat melakukan ini jika acara tersebut ditambahkan oleh metode jquery karena menyimpan salinan di jquery.data , itu tidak berfungsi sebaliknya, jadi ini sedikit curang / bekerja di sekitar dan berarti semuanya tidak kompatibel antara berbagai metode atau pustaka.
Di jsfiddle
Anda tidak bisa mendapatkan event handler terlampir langsung dari elemen itu sendiri.
Berikut adalah prinsip umum dalam javascript vanilla, ini adalah bagaimana jquery semua pustaka lain melakukannya (secara kasar).
Di jsfiddle
Tentu saja jquery dan perpustakaan lain memiliki semua metode pendukung lain yang diperlukan untuk mempertahankan daftar seperti itu, ini hanyalah sebuah demonstrasi.
sumber
.val('')
. Bukankah itu lebih sederhana daripada mengkloning elemen unggahan atau menambahkan formulir bersarang? +1..val("")
) bekerja dengan sempurna, terima kasih. Jauh lebih sederhana daripada mengkloning input dan menggantinya juga.Untuk alasan keamanan yang jelas Anda tidak dapat mengatur nilai input file, bahkan ke string kosong.
Yang harus Anda lakukan adalah mereset formulir di mana bidang atau jika Anda hanya ingin mengatur ulang input file dari formulir yang berisi bidang lain, gunakan ini:
Berikut ini contohnya: http://jsfiddle.net/v2SZJ/1/
sumber
Ini bekerja untuk saya.
http://forum.jquery.com/topic/how-to-clear-a-file-input-in-ie
Semoga ini bisa membantu.
sumber
Di IE8 mereka membuat bidang Unggah File hanya-baca untuk keamanan. Lihat posting blog tim IE :
sumber
$("#control").val('')
itu yang kamu butuhkan! Diuji pada Chrome menggunakan JQuery 1.11Pengguna lain telah menguji di Firefox juga.
sumber
Saya terjebak dengan semua opsi di sini. Inilah hack yang saya buat yang berfungsi:
dan Anda dapat memicu reset menggunakan jQuery dengan kode yang mirip dengan ini:
(jsfiddle: http://jsfiddle.net/eCbd6/ )
sumber
Saya berakhir dengan ini:
mungkin bukan solusi yang paling elegan, tetapi ini bekerja sejauh yang saya tahu.
sumber
Saya telah menggunakan https://github.com/malsup/form/blob/master/jquery.form.js , yang memiliki fungsi bernama
clearInputs()
crossbrowser, teruji dengan baik, mudah digunakan dan juga menangani masalah IE dan pembersihan bidang tersembunyi. jika diperlukan. Mungkin solusi yang agak panjang untuk hanya menghapus input file, tetapi jika Anda berurusan dengan unggahan file crossbrowser, maka solusi ini disarankan.Penggunaannya mudah:
sumber
Nilai input file hanya dibaca (untuk alasan keamanan). Anda tidak dapat mengosongkannya secara terprogram (selain dengan memanggil metode reset () dari formulir, yang memiliki cakupan lebih luas dari hanya bidang itu).
sumber
Saya dapat menjalankan tugas saya dengan kode berikut:
sumber
Saya telah mencari cara sederhana dan bersih untuk menghapus input file HTML, jawaban di atas sangat bagus, tetapi tidak ada yang benar-benar menjawab apa yang saya cari, sampai saya menemukan di web dengan sederhana cara elegan untuk melakukannya:
semua kredit untuk Chris Coyier .
sumber
The
.clone()
hal tidak tidak bekerja di Opera (dan mungkin orang lain). Itu membuat konten.Metode terdekat di sini bagi saya adalah Jonathan sebelumnya, namun memastikan bahwa bidang itu mempertahankan nama, kelas, dll dibuat untuk kode berantakan dalam kasus saya.
Sesuatu seperti ini mungkin bekerja dengan baik (terima kasih kepada Quentin juga):
sumber
Saya telah berhasil membuat ini berfungsi menggunakan yang berikut ...
Ini telah diuji di IE10, FF, Chrome & Opera.
Ada dua peringatan ...
Masih tidak berfungsi dengan benar di FF, jika Anda me-refresh halaman, elemen file akan diisi ulang dengan file yang dipilih. Darimana informasi ini didapat berada di luar jangkauan saya. Apa lagi yang terkait dengan elemen input file yang bisa saya coba hapus?
Ingatlah untuk menggunakan delegasi pada peristiwa apa pun yang Anda lampirkan ke elemen input file, sehingga mereka masih berfungsi ketika klon dibuat.
Apa yang saya tidak mengerti adalah siapa di dunia yang berpikir tidak memungkinkan Anda untuk menghapus bidang input dari pilihan file yang tidak dapat diterima adalah ide yang baik?
OK, jangan biarkan saya mengaturnya secara dinamis dengan nilai sehingga saya tidak bisa membasahi file dari OS pengguna, tetapi biarkan saya menghapus pilihan yang tidak valid tanpa mengatur ulang seluruh formulir.
Ini tidak seperti 'menerima' melakukan apa pun selain filter dan di IE10, ia bahkan tidak mengerti tipe mime MS Word, ini hanya lelucon!
sumber
.pop()
array file alih-alih mengaturnya menjadi null. ini tampaknya menghapus file dengan benar.Di Firefox 40.0.3 saya hanya berfungsi dengan ini
sumber
ini berfungsi untuk saya di setiap browser.
sumber
Saya mencoba dengan sebagian besar teknik yang disebutkan oleh pengguna, tetapi tidak ada yang bekerja di semua browser. yaitu: clone () tidak berfungsi di FF untuk input file. Saya akhirnya menyalin secara manual input file, dan kemudian mengganti yang asli dengan yang disalin. Ini bekerja di semua browser.
sumber
sumber
Ini berfungsi dengan Chrome, FF, dan Safari
Mungkin tidak bekerja dengan IE atau Opera
sumber
Jadikan tidak sinkron, dan setel ulang setelah tindakan yang diinginkan tombol selesai.
sumber
sumber
itu tidak bekerja untuk saya:
jadi di asp mvc saya menggunakan fitur silet untuk mengganti input file. pada awalnya buat variabel untuk string input dengan Id dan Nama dan kemudian gunakan itu untuk ditampilkan di halaman dan ganti pada tombol reset klik:
sumber
Cara mudah adalah mengubah tipe input dan mengubahnya kembali.
Sesuatu seperti ini:
sumber
Anda bisa menggantinya dengan klonnya seperti itu
Tapi ini klon dengan nilainya juga jadi kamu lebih baik seperti itu
sumber
Mudah lol (berfungsi di semua browser [kecuali opera]):
JS Fiddle: http://jsfiddle.net/cw84x/1/
sumber
Apa? Dalam fungsi validasi Anda, cukup cantumkan
Diasumsikan mengunggah adalah namanya:
Saya menggunakan JSP, tidak yakin apakah itu membuat perbedaan ...
Bekerja untuk saya, dan saya pikir itu jauh lebih mudah.
sumber