alternate to onchange event in <input type='

2019-01-18 04:28发布

问题:

Seems really a simple thing but can't figure it out. I've been using the onchange event on element and it works well. Once the user browses and selects a file, I get the path and upload it using a my custom js function.

The problem is this doesn't work if a user selects the same file twice in a row, the onchange doesn't fire (which makes sense since nothing changed) but in my case it's important for me to capture that event too, get the path and upload.

Edit

(Similar to Clearing <input type='file' /> using jQuery, not sure if I should resolve this as duplicate)

回答1:

You can just remove the input and create an identical one with javascript - the new one will be empty.

(edited answer to be straight to the point, comments are irrelevant now)



回答2:

You could have the choose file button clear the contents of the input onclick, that way even even if they choose the same file your event will still trigger. Of course, then your onchange handler will have to check for blank values, but it should probably be doing something similar or more anyway if it's going to use that value to upload a file...



回答3:

There really isn't any way to fix that. If you add any other listener or timer, then you will potentially upload the file even when the user doesn't want it to (eg, with an onclick). Are you sure uploading the same file can't be done in another way? What about clearing the input once the upload has started (or replace it with a new input if you can't clear it).



回答4:

You could not fire change event second time on the file input, but you can fire change event on the span. Below works in chrome and ff. I didn't check in IE. $('#change_span').bind('change',function(){ alert($('#file_1').val()) })

<span id='change_span'><input id="file_1" type="file"></span>



回答5:

Set the value of the input to "" in your onchange callback. That way, if the same file is selected the next time around, the onchange event will still be triggered because the value is different than "".

document.getElementById('files').value = "";


回答6:

Is this behavior only present in IE? If so, it may be related to this issue:
jQuery change event on <select> not firing in IE
In essence: You may need to check for onClick instead.



回答7:

function resetFileInput ($element) {
  var clone = $element.clone(false, false);
  $element.replaceWith(clone);
}

And then use live:

$('#element_id').live('change', function(){
...
});

Worked well for me!



回答8:

If you don't want to use jQuery

<form enctype='multipart/form-data'>
    <input onchange="alert(this.value); return false;" type='file'>
    <br>
    <input type='submit' value='Upload'>
</form>

It works fine in Firefox, but for Chrome you need to add this.value=null; after alert.