HTML <input type = 'file'> เหตุการณ์การเลือกไฟล์


148

สมมติว่าเรามีรหัสนี้:

<form action='' method='POST' enctype='multipart/form-data'>
    <input type='file' name='userFile'><br>
    <input type='submit' name='upload_btn' value='upload'>
</form>

ซึ่งส่งผลให้เกิดสิ่งนี้:

ภาพแสดงปุ่มเรียกดูและอัปโหลด

เมื่อผู้ใช้คลิกปุ่ม 'เรียกดู ... ' กล่องโต้ตอบค้นหาไฟล์จะเปิดขึ้น:

ภาพแสดงกล่องโต้ตอบการค้นหาไฟล์พร้อมไฟล์ที่เลือก

ผู้ใช้จะเลือกไฟล์โดยการดับเบิลคลิกที่ไฟล์หรือคลิกปุ่ม "เปิด"

มีเหตุการณ์ Javascript ที่ฉันสามารถใช้เพื่อรับการแจ้งเตือนหลังจากเลือกไฟล์ได้หรือไม่


9
ช่างเป็น UI ของ Windows แบบเก่า!
El-Burritos

@ El-Burritos นี้โพสต์ในปี 2010; แน่นอนว่ามันเป็น Windows UI แบบเก่า: D
Simon Cheng

คำตอบ:


188

รับฟังเหตุการณ์การเปลี่ยนแปลง

input.onchange = function(e) { 
  ..
};

3
เราจะเขียนมันโดยที่ .. ในแท็กสคริปต์จาวาสคริปต์
ดวงจันทร์

5
ใช่ในแท็กสคริปต์หรือคุณสามารถเพิ่มเป็นแอตทริบิวต์ ( <input type="file" onchange="..." />) แม้ว่าจะไม่แนะนำ
Anurag

7
โปรดทราบว่าใน IE7 และ 8 เหตุการณ์ "เปลี่ยนแปลง" จะไม่เกิดขึ้นกับเหตุการณ์แบบฟอร์ม คุณต้องใส่ Listener ของคุณบนแท็ก <input>
xer0x

40
แล้วถ้าผู้ใช้ต้องการ "โหลด" ไฟล์ใหม่ล่ะ? onchange จะไม่ทริกเกอร์ แต่มันควรจะโหลดซ้ำราวกับว่ามันกำลังโหลดในครั้งแรก
bryc

13
หมายเหตุจะใช้ไม่ได้หากผู้ใช้เลือกไฟล์เดียวกันมากกว่าหนึ่งครั้งติดต่อกันเนื่องจากไฟล์ไม่เปลี่ยนแปลง
bob0the0mighty

47

เมื่อคุณต้องโหลดไฟล์ซ้ำคุณสามารถลบค่าของอินพุตได้ ครั้งต่อไปที่คุณเพิ่มไฟล์เหตุการณ์ "on change" จะทริกเกอร์

document.getElementById('my_input').value = null;
// ^ that just erase the file path but do the trick

5
ใช้งานได้ดี แต่ระวังพฤติกรรมแปลก ๆ ของ IE <11 ไม่อนุญาตให้คุณเปลี่ยนค่าของอินพุตดังนั้นส่วนใหญ่คุณจะต้องมีวิธีแก้ปัญหาชั่วคราว stackoverflow.com/questions/9011644/…
Oleksandr Tkalenko


4

เหตุการณ์การเปลี่ยนแปลงจะถูกเรียกแม้ว่าคุณจะคลิกยกเลิก ..


2
มันจะช่วยได้ถ้าคุณจะให้รหัสเพื่ออธิบายคำตอบของคุณเนื่องจากไม่มีเหตุการณ์การเปลี่ยนแปลงใด ๆ ที่กล่าวถึงในข้อมูลโค้ดคำถาม
DevDig

ฉันคิดว่า @anthony หมายถึงสถานการณ์ต่อไปนี้: เลือกไฟล์ ตอนนี้เปิดตัวเลือกไฟล์อีกครั้ง แต่คราวนี้คลิกที่ยกเลิก เนื่องจากไม่มีการเลือกไฟล์ในครั้งที่สองการควบคุมอินพุตไฟล์จะรีเซ็ตดังนั้นจึงเปลี่ยนการเลือกเริ่มต้นและเหตุการณ์การเปลี่ยนแปลงจะเริ่มทำงาน
dvlsc

ฉันลองใช้ Chrome 83 และเหตุการณ์ไม่เริ่มทำงานเมื่อฉันคลิกที่ปุ่มยกเลิก คำตอบนี้ค่อนข้างเก่าและฉันเดาว่าต้องได้รับการแก้ไขแล้วอย่างน้อยก็ใน Chrome
Saeed Ahadian

4

นั่นคือวิธีที่ฉันทำกับ JS บริสุทธิ์:

var files = document.getElementById('filePoster');
var submit = document.getElementById('submitFiles');
var warning = document.getElementById('warning');
files.addEventListener("change", function () {
  if (files.files.length > 10) {
    submit.disabled = true;
    warning.classList += "warn"
    return;
  }
  submit.disabled = false;
});
#warning {
    text-align: center;
}

#warning.warn {
	color: red;
	transform: scale(1.5);
	transition: 1s all;
}
<section id="shortcode-5" class="shortcode-5 pb-50">
    <p id="warning">Please do not upload more than 10 images at once.</p>
    <form class="imagePoster" enctype="multipart/form-data" action="/gallery/imagePoster" method="post">
        <div class="input-group">
  	    <input id="filePoster" type="file" class="form-control" name="photo" required="required" multiple="multiple" />
	    <button id="submitFiles" class="btn btn-primary" type="submit" name="button">Submit</button>
        </div>
    </form>
</section>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.