Сброс курсора ожидания в браузере с помощью Content-Disposition: attachment - PullRequest
2 голосов
/ 06 января 2010

Хорошо работает следующий код:

<script type="text/javascript">
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_initializeRequest(InitializeRequest);
    prm.add_endRequest(EndRequest);

    function InitializeRequest(sender, args) {
        document.body.style.cursor = 'progress';
    }
    function EndRequest(sender, args) {
        document.body.style.cursor = 'default';
    }
</script>

Однако, когда ответ возвращает вложение (например, PDF из элемента управления ReportViewer):

Response.AddHeader("Content-Disposition", "attachment; filename=some.pdf")

EndRequest () никогда не срабатывает, и курсор прогресса не сбрасывается. Вызов Javascript, например

ScriptManager.RegisterStartupScript(this, this.GetType(), "close", 
   "parent.EndRequest(...);", true);

может помочь, но это невозможно из-за расположения содержимого. Можете ли вы придумать способ сделать это правильно - показать курсор ожидания во время рендеринга PDF и вернуться к нормальному курсору, когда PDF отображается? Здесь я предполагаю контекст C #, но проблема не в языке или платформе.

1 Ответ

2 голосов
/ 06 января 2010

Кажется, проблема в том, что функция EndRequest не запускается. Вы пытались увидеть, запускаются ли события pageLoading и pageLoaded?

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

Я бы переместил загрузку файла в iframe. Вот пример того, как это сделать:

function InitializeRequest(sender, args) {
    document.body.style.cursor = 'progress';

    var iframe = document.createElement("iframe");
    iframe.src = 'your pdf file';
    iframe.style.display = "none";
    document.body.appendChild(iframe); 
}

Затем вы можете получить доступ к событию загрузки iframe.

EDIT:

Дальнейшие поиски привели меня к этой странице . Кажется, он делает все, что вы хотите.

...