Saya senang bahwa browser peduli untuk menyelamatkan kami dari skrip yang mengganggu dan sejenisnya. Saya tidak senang dengan IE memasukkan sesuatu ke dalam peramban yang membuat perbaikan gaya sederhana seperti serangan balik!
Saya telah menggunakan <span> untuk mewakili input file sehingga saya bisa menerapkan style yang sesuai pada <div> daripada <input> (sekali lagi, karena IE). Sekarang karena ini IE ingin menunjukkan kepada Pengguna jalan dengan nilai yang hanya dijamin untuk membuat mereka waspada dan paling tidak khawatir (jika tidak benar-benar membuat mereka takut?!) ... LEBIH IE-CRAP!
Bagaimanapun, terima kasih kepada mereka yang memposting penjelasan di sini: Keamanan Browser IE: Menambahkan "fakepath" ke path file dalam input [type = "file"] , saya telah mengumpulkan fixer kecil-atas ...
Kode di bawah ini melakukan dua hal - itu memperbaiki bug IE8 lte di mana peristiwa onChange tidak menyala sampai bidang unggah onBlur dan memperbarui elemen dengan filepath dibersihkan yang tidak akan menakuti Pengguna.
// self-calling lambda to for jQuery shorthand "$" namespace
(function($){
// document onReady wrapper
$().ready(function(){
// check for the nefarious IE
if($.browser.msie) {
// capture the file input fields
var fileInput = $('input[type="file"]');
// add presentational <span> tags "underneath" all file input fields for styling
fileInput.after(
$(document.createElement('span')).addClass('file-underlay')
);
// bind onClick to get the file-path and update the style <div>
fileInput.click(function(){
// need to capture $(this) because setTimeout() is on the
// Window keyword 'this' changes context in it
var fileContext = $(this);
// capture the timer as well as set setTimeout()
// we use setTimeout() because IE pauses timers when a file dialog opens
// in this manner we give ourselves a "pseudo-onChange" handler
var ieBugTimeout = setTimeout(function(){
// set vars
var filePath = fileContext.val(),
fileUnderlay = fileContext.siblings('.file-underlay');
// check for IE's lovely security speil
if(filePath.match(/fakepath/)) {
// update the file-path text using case-insensitive regex
filePath = filePath.replace(/C:\\fakepath\\/i, '');
}
// update the text in the file-underlay <span>
fileUnderlay.text(filePath);
// clear the timer var
clearTimeout(ieBugTimeout);
}, 10);
});
}
});
})(jQuery);