Как зарегистрировать функцию Javascript для запуска с каждой обратной передачей? - PullRequest
1 голос
/ 17 марта 2010

У меня есть древовидная структура в пользовательском элементе управления. Мне нужно запускать функцию javascript с каждым асинхронным постбэком, чтобы прокрутить div в нужной позиции. У меня это работает, но я думаю, что должен быть "более чистый" способ сделать это. В функции элемента управления Page_Load у меня есть следующий код. Есть ли лучший способ сделать это?

ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.GetType(), "key" + DateTime.Now.Ticks, "RestorePosition();", true);

Для тех, кто ищет этот ответ, вот что я наконец-то сделал, и это сработало. Вверху страницы ascx у меня есть следующий код:


<script type="text/javascript">
    function pageLoad(sender, args) {
        Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(SavePosition);
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(RestorePosition);
    }

    function SavePosition(sender, args) {
        document.getElementById('hdnScrollSaver').value = document.getElementById('reportTreeViewdiv').scrollTop;
    } 
    function RestorePosition(sender, args) {
        document.getElementById('reportTreeViewdiv').scrollTop = document.getElementById('hdnScrollSaver').value;
    } 

</script>

А потом я обернул дерево в тег div следующим образом:


<div class="reportTreeView" id="reportTreeViewdiv">
                    <asp:TreeView ID="TreeView1" runat="server" OnTreeNodePopulate="TreeView1_TreeNodePopulate" 
                        OnSelectedNodeChanged="TreeView1_SelectedNodeChanged" PathSeparator="|" SkinID="ReportTreeView" />
                </div>

Надеюсь, это кому-нибудь поможет.

Ответы [ 3 ]

4 голосов
/ 17 марта 2010

Ajax предоставляет вам жизненный цикл страницы, похожий на страницу ASP.Net, но на стороне клиента. Таким образом, в событии pageLoad мы можем подключить функции, которые будут вызываться при каждом начальном и конечном запросах.

function pageLoad(sender, args) {
  Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequest);
  Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest);
}

function beginRequest(sender, args) {
        // begin request code - i.e. make a "processing" div visible
}

function endRequest(sender, args) {
        // we are back
        RestorePosition(); 
}
1 голос
/ 17 марта 2010

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

Согласно MSDN :

Идентифицируя сценарий с помощью ключа, несколько экземпляров серверного элемента управления могут запрашивать блок сценария без его двойной отправки в выходной поток.

Любые блоки скриптов с одинаковыми значениями параметров ключа считаются дубликатами.

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

1 голос
/ 17 марта 2010

Я думаю, что это «чистый» способ сделать это. Вы используете ScriptManager так, как он должен использоваться.

Если вам не нравится внешний вид этой строки кода, вы всегда можете изменить его на класс Script Utility или что-то в этом роде. Я бы не стал, но это только я.

...