Когда открывается диалог загрузки файла? - HTML, Javascript - PullRequest
1 голос
/ 02 апреля 2010

У меня есть html-страница, и когда я щелкаю ссылку на файл на странице, появляется диалоговое окно загрузки файла, и этот диалог блокирует страницу. Я имею в виду, не выбрав один из вариантов (Открыть, Сохранить, Отмена), я ничего не могу сделать на странице (что нормально). Что мне нужно, это если яваскрипт может проверить, заблокирована страница или нет. (или выскочил ли диалог с файлом?)

p.s. не говорите «поместить событие onclick в ссылку», поскольку сервер может реагировать очень медленно (например, через 30 секунд после нажатия)

Ответы [ 2 ]

3 голосов
/ 02 апреля 2010

Если вы знаете, что ваш сервер возвращает файл для загрузки, тогда вы можете угадать , когда диалоговое окно появляется с помощью этого трюка (о котором я узнал из ответа stackoverflow на связанный вопрос I спросил):

  1. Когда вы отправляете HTTP-запрос со своей страницы, добавьте параметр, значением которого является некоторая случайная строка (например, "random" + new Date().getTime() - это не обязательно должно быть безопасно, но вы хотите избежать коллизий)

  2. Сервер ищет этот параметр. Когда он начинает отправлять вложение для загрузки, он добавляет файл cookie со случайной строкой в ​​качестве значения.

  3. Теперь, после того как страница выдает запрос HTTP, запускается интервальный таймер. Код в функции таймера проверяет document.cookie на поиск этой случайной строки. Как только document.cookie содержит эту строку, вы знаете, что ответ HTTP поступил в браузер. Поскольку вы знаете, что браузер попросит пользователя сохранить вложение, вы можете сделать вывод, что в этот момент отображается диалоговое окно файла.

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

1 голос
/ 02 апреля 2010

Поскольку страница заблокирована , вы ничего не можете сделать с JavaScript, потому что она также заблокирована.

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

Если это не то, что вы пытаетесь сделать, то единственный способ - использовать либо onclick по ссылке, либо onunload / onbeforeunload, но они менее надежны, и я уверен, что вы найдете полностью различное поведение в разных браузерах.

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

var lastTime = new Date().getTime();
function checkTime() {
    var curTime = new Date().getTime();
    if (curTime - lastTime > 1100) { // 1100 because there might be small browser lags 
        // do something after the dialog appeared and the user did something with it
    }
    lastTime = curTime;
}
setInterval(checkTime, 1000);

Обратите внимание, что существуют браузеры (я думаю, что это пример Chrome), которые не блокируют страницу, пока открыто это диалоговое окно, поэтому это может не работать. Обязательно перепроверьте все, если вы собираетесь использовать это.

Мне нужно пойти принять душ.

...