Я щасливий, що браузери дбають про те, щоб врятувати нас від настирливих сценаріїв тощо. Я не задоволений тим, що IE вкладає щось у браузер, що робить просте виправлення стилю схожим на хакер-атаку!
Я використовував <span> для представлення файлового вводу, щоб я міг застосувати відповідний стиль до <div> замість <input> (ще раз через IE). Тепер завдяки цьому IE хочу показати користувачеві шлях зі значенням, яке гарантовано поставити їх під охорону і, по крайней мере, побоюватися (якщо зовсім не відлякати їх!) ... БІЛЬШЕ IE-CRAP!
У будь-якому випадку, завдяки тим, хто розмістив пояснення тут: IE Browser Security: Додавання "fakepath" до файлу шляху вводу [type = "file"] , я зібрав другорядний фіксатор-верхній ...
У наведеному нижче коді є дві речі - він виправляє помилку lte IE8, де подія onChange не спрацьовує, доки на поле завантаження onBlur не буде оновлено елемент очищеним файловим шляхом, який не лякатиме користувача.
// 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);