2009-07-30 2 views
5

Я проводке сценарий запуска JavaScript функции на Page_Load, чтобы стрелять, как так:document.readyState == "complete" всегда false. Государство всегда «интерактивный»

ScriptManager.RegisterStartupScript(Me, GetType(Page), "page_init", "page_init();", True) 

Эта функция вызывает несколько различных функций для настройки страницы. Одна из этих функций проверяет document.readyState и гарантирует, что это "complete". Это касается изображений, и я хочу, чтобы все было полностью реализовано.

if (document.readyState == "complete") { 

Все работает отлично, пока я не должен написать массив в OutputStream (с помощью Response.BinaryWrite или Response.OutputStream.Write() дать файл пользователю. После этого document.readyState всегда «интерактивный», пока я не перейти выключение страницы и обратно.Я даже использовал вызов setTimeout(myFunction, 1000);, если document.readyState не является полным, чтобы рекурсивно вызвать функцию до тех пор, пока она не будет завершена.

Я исследовал это сам в течение некоторого времени, и не может понять это поведение. Любые идеи относительно того, как это происходит?

+0

Выполняется сценарий на стороне сервера или на стороне клиента. Если вы используете скрипт на стороне сервера, это нормально, так как он продолжает ждать завершения вашего скрипта. – BYK

ответ

5

Я только что узнал, что проблема связана с IFrame, из которого я извиняюсь, была деталь, о которой не было речи.

Более подробную информацию можно найти here:

IE (удивительно получает мой голос из утверждения здесь) Там является onreadystatechange событие, которое срабатывает всякий раз, когда readyState изменении свойства Iframe в. Это readyState отражает, где загрузка находится в процессе .

Inline: При первоначальной установке значения параметра iRrame src значение readyState изменяется на загрузку.Когда файл полностью загружен, readyState переходит на интерактивный. Большая разница между IE и другими браузерами заключается в том, что IE затем меняет свойство readyState для завершения , когда страница (или приложение) равна , полностью загружена и готова для пользователя.

Вложение: Это ведет себя идентично в случае Встраиваемый ИЭ, но readyState свойство никогда не меняется полной. Это не сильно заставило бы смысла, так как пользователю необходимо вручную открыть файл , дважды щелкнув по нему или открыв его из какого-либо приложения.

5

Для того, чтобы ReadyState перевернулась, чтобы завершить, серверная сторона должна завершить соединение.

Если вы посмотрите на свой код, вы, вероятно, не вызываете Response.End ПОСЛЕ BinaryWrite или WriteToStream. Это необходимо, чтобы очистить ответ и предупредить клиента о том, что все было передано.

Обратите внимание, что после выполнения вызова Response.End вы все равно можете обрабатывать сервер данных, вы просто не можете отправить больше данных клиенту.

Хорошим примером того, как это сделать, является страница 171 освоения ASP.Net с помощью C# А. Рассела Джонса (google preview here).

Гайка состоит в том, что вы должны создать свой поток, прочитать его в байт-массиве, закрыть поток, затем выполнить BinaryWrite и, наконец, вызвать Response.End.

+0

Я вызываю Response.End после того, как я выписал файл. Попытался бы отправить больше данных клиенту после ответа. И причиной этого? –

+0

Возможно .. Однако я считаю, что Response.End закрывает соединение с браузером. Поэтому любая попытка отправить больше данных * должна * потерпеть неудачу. Тем не менее, не делайте этого. ;) – NotMe

0

Вы пробовали позвонить Response.Close() вместо или перед Response.End()? После сравнения их в Reflector, казалось бы, они разные.

+0

Интересно. Произошли ли вы, чтобы проследить, какие различия были? – NotMe

0

При записи непосредственно в поток, вы должны установить HTTP-заголовок длины контента на правильный размер отправляемых двоичных данных. Это может быть также проблема с типом контента (multipart/...), который может смутить браузер.

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