ChatGPT解决这个技术问题 Extra ChatGPT

HTML <input type='file'> File Selection Event

Let's say we have this code:

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

which results in this:

https://i.stack.imgur.com/bT2hc.png

When the user clicks the 'Browse...' button, a file search dialog box is opened:

https://i.stack.imgur.com/Y10eN.png

The user will select the file either by double-clicking the file or by clicking the 'Open' button .

Is there a Javascript Event that I can use to be notified after after the file is selected?

What a funky old windows UI !
@El-Burritos this was posted in 2010; of course, it's an old Windows UI:D

A
Anurag

Listen to the change event.

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

yes in script tags, or you could add it as an attribute (<input type="file" onchange="..." />) although this is not recommended.
Note that in IE7 and 8 that the 'change' event doesn't bubble up to the form event. You need to put your listener on the tag.
What about if a user needs to "reload" a file? onchange will not trigger, but it should still reload as if it was loading it for the first time.
Note, this doesn't work if the user picks the same file more than once in a row since the file didn't change.
Make sure to empty out the value after onchange event is handled, otherwise onchange wont get triggered next time if the user decides to choose different file after the initial selection
j
jgillich

When you have to reload the file, you can erase the value of input. Next time you add a file, 'on change' event will trigger.

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

That works fine but be aware of weird IE <11 behavior. It doesn't allow you to change input's value, so most likely you will need a workaround. stackoverflow.com/questions/9011644/…
Z
Zanon

jQuery way:

$('input[name=myInputName]').change(function(ev) {

    // your code
});

R
RegarBoy

That's the way I did it with pure 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; } warning.classList -= "warn"; submit.disabled = false; }); #warning { text-align: center; transition: 1s all; } #warning.warn { color: red; transform: scale(1.5); }

Please do not upload more than 10 images at once.


a
anthony

The Change event gets called even if you click on cancel..


it would help if you would provide some code to explain your answer, since there is no change event mentioned in the Questions code snippet
I think @anthony is referring to the following scenario: Select a file. Now open the file selector again, but this time click on Cancel. Since no file was selected the second time, the file input control resets, thus changing its initial selection, and the change event is fired.
I tried it on Chrome 83 and the event doesn't get fired when I click on the Cancel button. This answer is pretty old and I guess it must've been fixed, at least on Chrome.
A
Ahmedur Rahman Shovon

Though it is an old question, it is still a valid one.

Expected behavior:

Show selected file name after upload.

Do not do anything if the user clicks Cancel.

Show the file name even when the user selects the same file.

Code with a demonstration:

File upload event


Explanation:

The onchange event handler is used to handle any change in file selection event.

The onchange event is triggered only when the value of an element is changed. So, when we select the same file using the input field the event will not be triggered. To overcome this, I set this.value = null; at the end of the onchange event function. It sets the file path of the selected file to null. Thus, the onchange event is triggered even at the time of the same file selection.