브라우저가 방해가되는 스크립트 등으로부터 우리를 구해 주어야한다는 것이 기쁘다. IE가 간단한 스타일 수정을 해킹 공격처럼 보이게하는 브라우저에 무언가를 넣는 것에 만족하지 않습니다!
<span>을 사용하여 파일 입력을 나타내므로 <input> 대신 <div>에 적절한 스타일을 적용 할 수 있습니다 (IE로 인해 다시 한 번). 이제는이 IE로 인해 사용자에게 가드와 최소한의 불안감을 줄 수있는 값을 가진 경로를 보여주고 자합니다.
어쨌든, 여기에 설명을 게시 한 사람들 덕분에 IE 브라우저 보안 : input [type = "file"]의 파일 경로에 "fakepath"를 추가 하여 사소한 해결사-상단을 정리했습니다 ...
아래 코드는 두 가지 작업을 수행합니다. 업로드 필드의 onBlur까지 onChange 이벤트가 시작되지 않고 사용자를 놀라게하지 않는 정리 된 파일 경로로 요소를 업데이트하는 IE8 버그를 수정합니다.
// 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);