Yep, есть , но это довольно сложно. Единственный способ, которым я нашел, - использовать iframe на клиенте, а response.writeing на сервере отправлять блоки javascript обратно клиенту, что javascript вызывает родительское окно для обработки сообщений о состоянии.
Вот пример кода. Там могут быть проблемы с этим, я отключаю его из гораздо большего приложения.
HTML:
<button id="doStuff">
<div id="status"></div>
<div id="iframeHolder"></div>
JavaScript:
//This one will be called from the HTML the javascript is streaming back
function updateStatus(message) {
$('#status').html(message);
}
$('#doStuff').click(function(event) {
event.preventDefault();
var url="your.page.html";
$('#iframeHolder').html('<iframe src="' + url + '"></iframe>');
}
стороне сервера (это VB asp.net, но вы должны быть в состоянии сделать это на вашем языке выбора):
dim message as string = "hello world"
dim script = String.Format("<script type='text/javascript'>parent.updateStatus('{0}');</script>",message)
Response.Write(script)
Response.Flush()
Некоторые наблюдения
- Querystring будет вашим другом здесь. Я не уверен, если вы можете запрограммировать обратную передачу в iframe.
- Вам, вероятно, придется добавить мусор для кэширования в очередь, иначе браузер, скорее всего, будет кэшировать содержимое. Это будет очень быстро, но неправильно :-)
- Возможно, вам придется отправить «некоторый» html, прежде чем браузер начнет обрабатывать материал iframe. Я обнаружил, что отправка комментария HTML около 1 тыс. Мусора помогает
- Чтобы избежать проблем с обновлением в FF и проблемах с «постоянной загрузкой» в хромированном и сафари, установите значение src iframe примерно: пустое после завершения (
$('#iframeHolder iframe').attr('src','about:blank')
)
- прогресс бар JQuery UI выглядит довольно шикарном для отображения процентов обработанных
Надежда, что помогает. Я потерял голову с этим пару месяцев назад :-)
, возможно, вы захотите добавить ответ ,Flush() до конца, так что он отправляется прямо в браузер вместо ожидания – LucasS
@LucasS хороший вызов –