Невозможно прямо сейчас открыть всплывающее окно файла из обратного вызова async ajax из-за рекомендованных w3c функций безопасности в браузерах.
В поведении активации элемента ввода файла он сначала проверяет, разрешено ли алгоритму отображать всплывающее окно, а затем отменяет последующие шаги, не делая ничего другого. из w3c.org
Алгоритму разрешено показывать всплывающее окно, если выполнено одно из следующих условий:
DocumentEvent.createEvent("Event")
, модифицированным с помощью метода Event.initEvent()
или отправленным методом EventTarget.dispatchEvent()
. Атрибут isTrusted доверенных событий имеет значение true, а недоверенные события имеют значение атрибута isTrusted false. В противном случае. http://www.w3.org/TR/2012/WD-DOM-Level-3-Events-20120614/#trusted-events .) В вашем коде событие клика не запускается пользователем, а запускается с помощью полного обратного вызова ajax. Здесь браузер заявляет, что этому событию нельзя доверять, чтобы открыть всплывающее окно. В некоторых браузерах вы можете видеть, что атрибут isTrusted
установлен в true, если событие объявлено как доверенное. https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted
Примечание
Различные браузеры ловят разницу между активированным скриптом cick и реальным пользователем с использованием разных методов.
Что вы можете сделать в этом сценарии, для отключения кнопки ввода файла (или всей формы) и включения после завершения ajax. Таким образом, пользователь не будет нажимать кнопку загрузки до тех пор, пока запрос ajax не будет завершен. На данный момент нет другого способа сделать это за один клик, так как для открытия всплывающего окна есть ограничение по таймфрейму. Когда я проверил в хроме, таймфрейм равен 1000 мс. 1000 мс после действия пользователя, окно не открывается.