Похоже, что прослушиватель событий change
удаляется, потому что вы используете innerHTML
для обновления того же элемента (wrapper
), в котором находится сам вход.Таким образом, содержимое элемента wrapper
, включая ввод файла, перерисовывается, и по ходу дела слушатель событий удаляется (или, скорее, он подключен к элементу, которого там больше нет).
Вот простой jsfiddle , который делает то же самое, что и ваш код, за исключением того, что он печатает выбранные имена файлов в элементе, отличном от элемента, в котором находится ввод. И это работает (в любом случае в WebKit
Вот еще одно доказательство (я в основном скопировал ваш код и добавил строку для перерегистрации прослушивателя событий только после изменения wrapper.innerHTML
)
событие change
запускает для каждого изменения, но наблюдаемый ввод удаляется с помощью innerHTML
на родительском элементе ввода.
Честно говоряне знаю, является ли это допустимой ошибкой браузера или нет.innerHTML
имеет смысл "перезаписать" существующий элемент ввода, но браузер достаточно умен, чтобы не сбрасывать значение ввода, так что вы можете подумать, что слушатели тоже будут задерживаться ... так что ... ну, это сбивает с толку