Как отменить загрузку файла с помощью dojo.io.iframe.send? - PullRequest
4 голосов
/ 15 ноября 2008

Я использую метод dojo.io.iframe.send для отправки файла на мой сервер. Я хочу предоставить способ, чтобы пользователь мог отменить отправку после ее выполнения, если это занимает слишком много времени или пользователь понимает, что отправила неверный файл.

Я не могу придумать, как это сделать. Я мог бы использовать тайм-аут для завершения отправки, если это занимает много времени (то есть сервер не отвечает быстро), но это не то, что я хочу. Я хочу прекратить действие в любое время, когда пользователь делает жест (например, нажав кнопку «Отмена».

Спасибо!

Ответы [ 4 ]

3 голосов
/ 03 февраля 2009

Привет, я понимаю, что это довольно запоздалый ответ, поэтому я надеюсь, что вы или кто-то, кто наткнулся здесь через Google, найдут какое-то применение для этого.

можно отменить загрузку файла в iFrame, в Firefox вы можете вызвать метод window.stop() в iFrame. IE, однако, не имеет этого метода, но поставляется с execCommand("Stop"), однако, так как ручное нажатие кнопки stop не работает, сценарий остановки также не работает.

Мои первые попытки были связаны с установкой местоположения iFrame на about:blank, но, к сожалению, безрезультатно. Однако просмотр источника с телом отменит iFrame POST!

3 голосов
/ 24 ноября 2008

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

Навигация в сторону может помочь, но браузер все равно должен прервать передачу или нет - для этого нет спецификации.

Подводя итог: невозможно сделать это надежным в JavaScript в портативном режиме. Это означает, что Dojo не предоставляет эту функциональность.

2 голосов
/ 23 марта 2012

Итак, я понимаю, что это действительно старый пост (4 года!), На который я отвечаю. Но я нашел его, когда искал ответ, который должен был, ретроспективно, быть очевидным, но не отвеченный здесь (и нигде, где я смотрел). Итак, ради очередного бедного шлуба:

Если (как и я), вы не заботитесь о фактической остановке передачи файлов, а просто хотите, чтобы dojo.io.iframe ПЕРЕМЕЩАЛСЯ с жизнью (эффективно отменяя с точки зрения пользователя), вы можете просто проигнорировать результат отложенных обратных вызовов. Однако, если вы также хотите затем загрузить дополнительные вещи через dojo.io.iframe, вы также должны сделать так, чтобы dojo.io.iframe также игнорировал результат. Чтобы сделать это, это раздражает просто ... вызов dojo.io.iframe.send() возвращает отложенное. Если вы хотите отменить загрузку таким образом, чтобы dojo.io.iframe выполнял последующие вызовы отправки в очереди (поскольку он может выполнять только один вызов за раз), вам просто нужно вызвать .cancel() для отложенного вызова, который вернулся после отправки, что в данный момент выполняется.

Как в:

    var dfd = dojo.io.iframe.send({...});
    var dfd2 = dojo.io.iframe.send({...}); // this send will not start until the first one completes. it is blocked internally by dojo.io.iframe.

...

Теперь пользователь где-то нажимает кнопку отмены, потому что загрузка занимает слишком много времени, или они поняли, что не хотели загружать выбранный файл. Мы не хотим ждать, пока будет завершена первая передача файла, потому что мы больше не заботимся о результате этой передачи.

onclick: function() {
    dfd.cancel();
}

Вызов отмены на dfd позволит немедленно выполнить второй send() вызов. если вы посмотрите в fiddler, вы увидите, что вторая загрузка теперь начинается немедленно, а не ожидает завершения первой (отмененной), как это было бы без вызова .cancel() для отложенного.

Без отмены первой отсрочки dojo.io.iframe будет продолжать должным образом ожидать результата первой загрузки, тем самым блокируя любые последующие вызовы send() в очереди, ожидающие обработки через dojo.io.iframe.

0 голосов
/ 17 августа 2009

То, что сделал друг, просто перезагрузило веб-страницу, когда была нажата кнопка отмены (я думаю, вызвав функцию document.location.refresh). Существует также способ контроля за ходом загрузки (с индикатором выполнения), но он зависит от сервера (в случае, если я видел, это был модуль apache, тогда вы будете запрашивать прогресс по указанной ссылке и серверу). вернул бы прогресс).

...