2010-04-02 3 views
1

У меня есть html-страница, и когда я нажимаю ссылку на файл на странице, открывается диалоговое окно загрузки файла, и этот диалог файла блокирует страницу. Я имею в виду, не выбирая один из вариантов (Open, Save, Cancel). Я ничего не могу сделать на странице (что нормально). Мне нужно, если javascript может проверить, заблокирована ли страница или нет. (или открывается диалоговое окно файла?)Когда открывается диалоговое окно загрузки файла? - HTML, Javascript

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

+0

* «Не говорите», чтобы связать событие onclick с ссылкой, потому что сервер может реагировать очень медленно (например, через 30 секунд после нажатия) ». * Что бы ** сервер ** имел к этому отношение? Когда вы выбираете файл, это все клиентская сторона. Сервер не участвует, пока вы не отправите форму. –

+0

Фактически, я отправляю форму, когда нажимается ссылка, и ответ формы - это файл, а не html-документ. – Feyyaz

+0

Какой браузер вы используете? Я тестировал в IE, Firefox, Opera и Chrome. Chrome был единственным, кто «заблокировал» страницу. – nemetroid

ответ

1

Поскольку страница заблокирована, вы ничего не можете сделать с помощью 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 пример, я думаю), что не блок страницу в то время как этот диалог открыт, так что это может не сработать. Обязательно дважды перепроверьте все, если вы это сделаете.

Теперь мне нужно принять душ.

+0

, что грязное решение настолько умное :). Спасибо. – Feyyaz

+0

К сожалению, решение не работает в IE6. Это было разумно, хотя :). – Feyyaz

+0

Возможно, мне просто нужно немного поработать над IE6 (я не понимаю, почему этого не произойдет, если IE6 не заблокирует страницу). Возможно, IE6 не знает о '.getTime()' или что-то еще. Это дает какие-либо ошибки? – Felix

3

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

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

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

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

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

+0

Стоит попробовать, я сообщу вам о результатах после попытки. Благодарю. – Feyyaz

Смежные вопросы