Tôi rất vui khi các trình duyệt quan tâm để cứu chúng tôi khỏi các tập lệnh xâm nhập và tương tự. Tôi không hài lòng với việc IE đưa thứ gì đó vào trình duyệt khiến cho việc sửa kiểu đơn giản trông giống như một cuộc tấn công hack!
Tôi đã sử dụng <span> để thể hiện đầu vào tệp để tôi có thể áp dụng kiểu dáng phù hợp cho <div> thay vì <input> (một lần nữa, vì IE). Bây giờ do IE này muốn hiển thị cho Người dùng một đường dẫn có giá trị được bảo đảm để bảo vệ họ và ở mức độ ít gây sợ hãi nhất (nếu không hoàn toàn khiến họ sợ hãi ?!) ... THÊM IE-CRAP!
Nhưng dù sao, nhờ những người đã đăng lời giải thích ở đây: IE Browser Security: Nối "fakepath" vào đường dẫn tệp trong đầu vào [type = "file"] , tôi đã kết hợp một trình sửa lỗi nhỏ trên ...
Đoạn mã dưới đây thực hiện hai điều - nó sửa một lỗi IE8 trong đó sự kiện onChange không kích hoạt cho đến khi trường tải lên onBlur và nó cập nhật một phần tử với filepath đã được làm sạch sẽ không khiến Người dùng sợ hãi.
// 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);