Чередовать событие onchange в <input type='file'/">

Кажется, действительно простая вещь, но она не может понять. Я использую событие onchange для элемента, и он работает хорошо. Когда пользователь просматривает и выбирает файл, я получаю путь и загружаю его с помощью моей пользовательской функции js.

Проблема в том, что это не работает, если пользователь дважды выбирает один и тот же файл, он не загорается (что имеет смысл, поскольку ничего не изменилось), но в моем случае для меня важно также зафиксировать это событие, получить путь и загрузить.

Изменить

(Подобно Очистка < input type = 'file'/ > с помощью jQuery, не уверен, что я должен разрешить это как дубликат)

Ответы

Ответ 1

Вы можете просто удалить вход и создать идентичный с javascript - новый будет пустым.

(отредактированный ответ, чтобы быть прямо к точке, комментарии теперь неактуальны)

Ответ 2

У вас может быть кнопка выбора файла, очищающая содержимое ввода onclick, таким образом, даже если они выбирают один и тот же файл, событие все равно будет срабатывать. Конечно, тогда ваш обработчик onchange должен будет проверить пустые значения, но, вероятно, он должен делать что-то подобное или больше, если он будет использовать это значение для загрузки файла...

Ответ 3

На самом деле нет никакого способа исправить это. Если вы добавите любой другой прослушиватель или таймер, вы сможете загрузить файл, даже если пользователь этого не хочет (например, с помощью onclick). Вы уверены, что загрузка одного и того же файла не может быть выполнена по-другому? Как очистить ввод после запуска загрузки (или заменить его новым вводом, если вы не можете его очистить).

Ответ 4

Вы не смогли запустить событие изменения во второй раз при вводе файла, но вы можете запустить событие изменения на промежутке. Ниже работает в хром и ff. Я не проверял IE. $('#change_span').bind('change',function(){ alert($('#file_1').val()) })

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

Ответ 5

Задайте значение входа "в вашем обратном вызове onchange. Таким образом, если тот же самый файл будет выбран в следующий раз, событие onchange все равно будет запущено, потому что значение отличается от".".

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

Ответ 7

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

И затем используйте live:

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

Хорошо работает для меня!

Ответ 8

Если вы не хотите использовать jQuery

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

Он отлично работает в Firefox, но для Chrome вам нужно добавить this.value=null; после предупреждения.