ฉันมีความสุขที่เบราว์เซอร์ใส่ใจที่จะช่วยเราให้รอดพ้นจากสคริปต์ที่ล่วงละเมิดและไม่ชอบ ฉันไม่มีความสุขกับการใส่ IE ลงในเบราว์เซอร์ที่ทำให้การแก้ไขสไตล์แบบง่าย ๆ ดูเหมือนแฮ็คโจมตี!
ฉันใช้ <span> เพื่อแสดงไฟล์อินพุตเพื่อให้ฉันสามารถใช้สไตล์ที่เหมาะสมกับ <div> แทน <input> (อีกครั้งเนื่องจาก IE) ตอนนี้เนื่องจาก IE นี้ต้องการแสดงพา ธ ของผู้ใช้ที่มีค่าซึ่งรับประกันว่าจะทำให้พวกเขาระวังตัวและอยู่ในความวิตกกังวลน้อยที่สุด (ถ้าไม่ทำให้พวกเขากลัว!
อย่างไรก็ตามขอขอบคุณผู้ที่โพสต์คำอธิบายที่นี่: IE Browser Security: การต่อท้าย "fakepath" ไปยังเส้นทางของไฟล์ใน input [type = "file"]ฉันได้รวบรวมผู้ให้บริการรายย่อย ...
โค้ดด้านล่างทำสองสิ่ง - แก้ไขข้อผิดพลาด lte IE8 ที่เหตุการณ์ onChange ไม่เริ่มทำงานจนกว่า onBlur ของฟิลด์อัปโหลดและอัปเดตองค์ประกอบด้วย filepath ที่สะอาดซึ่งจะไม่ทำให้ผู้ใช้กลัว
// 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);