Что делает ExtensionlessUrlHandler в приложении MVC?

Невозможно прямо сейчас открыть всплывающее окно файла из обратного вызова async ajax из-за рекомендованных w3c функций безопасности в браузерах.

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

Алгоритму разрешено показывать всплывающее окно, если выполнено одно из следующих условий:

  1. Задача, в которой алгоритм работает в настоящее время обрабатывает поведение активации, которому было доверено событие клика. (доверенные события: события, которые генерируются пользовательским агентом, либо в результате взаимодействия с пользователем, либо как прямой результат изменений в DOM, доверяются пользовательский агент с привилегиями, которые не предоставляются событиям, генерируемым скриптом, методом 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 .)
  2. Задача, в которой выполняется алгоритм, в настоящее время запускает прослушиватель событий для доверенного события, тип которого находится в следующем списке: change click dblclick mouseup reset submit
  3. Задача, в которой работает алгоритм, была поставлена ​​в очередь алгоритмом, которому было разрешено отображать всплывающее окно, а цепочка таких алгоритмов запускалась в пределах определенного пользователем периода времени.

w3c.org

В вашем коде событие клика не запускается пользователем, а запускается с помощью полного обратного вызова ajax. Здесь браузер заявляет, что этому событию нельзя доверять, чтобы открыть всплывающее окно. В некоторых браузерах вы можете видеть, что атрибут isTrusted установлен в true, если событие объявлено как доверенное. https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted

Примечание

Различные браузеры ловят разницу между активированным скриптом cick и реальным пользователем с использованием разных методов.

Что вы можете сделать в этом сценарии, для отключения кнопки ввода файла (или всей формы) и включения после завершения ajax. Таким образом, пользователь не будет нажимать кнопку загрузки до тех пор, пока запрос ajax не будет завершен. На данный момент нет другого способа сделать это за один клик, так как для открытия всплывающего окна есть ограничение по таймфрейму. Когда я проверил в хроме, таймфрейм равен 1000 мс. 1000 мс после действия пользователя, окно не открывается.

20
задан Community 23 May 2017 в 12:17
поделиться