c# - 自定义 ASP.NET 控件中的 Begin/EndRequestHandler 多个处理程序

标签 c# javascript jquery asp.net ajax

我有一个自定义 ASP.NET 控件,一个下拉列表/ TreeView ,它需要添加 Begin(End-)RequestHandlers 以防止在 UpdatePanel 部分回发期间滚动到容器顶部(如所述 here )。它们是动态添加的,如下所示:

Page.ClientScript.RegisterStartupScript(this.GetType(), this.ClientID, string.Format(@"
                  var xPos, yPos;
                  var prm = Sys.WebForms.PageRequestManager.getInstance();

                  function BeginRequestHandler(sender, args) {{
                    if ($get('{0}') != null) {{
                      // Get X and Y positions of scrollbar before the partial postback
                      xPos = $get('{0}').scrollLeft;
                      yPos = $get('{0}').scrollTop;
                    }}
                 }}

                 function EndRequestHandler(sender, args) {{
                     if ($get('{0}') != null) {{
                       // Set X and Y positions back to the scrollbar
                       // after partial postback
                       $get('{0}').scrollLeft = xPos;
                       $get('{0}').scrollTop = yPos;
                     }}
                 }}

                 prm.add_beginRequest(BeginRequestHandler);
                 prm.add_endRequest(EndRequestHandler);  ", this.ItemsContainer.ClientID), true);

当我向页面添加多个控件实例时,问题就出现了。这两个脚本都被渲染和注册,但最终只有一个,即页面上的最后一个,最终附加到容器,即。只要面板 X 或 Y 中有更新,则仅执行面板 Y 的 JS - 两次!

更好的选择肯定是仅附加一对开始/结束处理程序,我可以通过例如为 RegisterStartupScript 方法添加静态键来执行此操作。唯一的问题是我需要传递当前更新 UpdatePanel 的面板参数。

知道如何做到这一点,并与上面的结合起来吗?

最佳答案

此修改会自动恢复所有面板的滚动位置。

<script type="text/javascript">
    (function () {
        var scrolledDivs = [];
        var prm = Sys.WebForms.PageRequestManager.getInstance();

        prm.add_beginRequest(function (sender, args) {

            //store the scroll positions of all "scrolled" div elements
            //UpdatePanel and Panel both are div elements
            scrolledDivs = [];

            $('div').each(function () {
                var div = $(this);
                if (div.scrollLeft() != 0 || div.scrollTop() != 0) {
                    scrolledDivs.push({
                        element: this,
                        scrollLeft: div.scrollLeft(),
                        scrollTop: div.scrollTop()
                    });
                }
            });
        });

        prm.add_endRequest(function (sender, args) {
            //restore scroll positions
            $.each(scrolledDivs, function (index, value) {
                $(value.element).scrollLeft(value.scrollLeft).scrollTop(value.scrollTop);
            });
        });
    })();
</script>

注意:您需要包含 JQuery

关于c# - 自定义 ASP.NET 控件中的 Begin/EndRequestHandler 多个处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21603120/

相关文章:

c# - 无论我做什么总是得到错误 : Keystore file exists but is empty In Unity

javascript - YouTube iframe 嵌入违规 : non-passive event listener to a scroll-blocking 'touchstart' event

javascript - 从外部文件读取的工具提示文本

javascript - 加载 20MB 以上网页的最有效方法

javascript - 使用相关 Json 数据从 LocalStorage Key-ID 填充表单

c# - AutoFac:注入(inject) NULL 值

c# - 无符号整数 (c++) 与 uint (c#)

c# - 如何在 C# 中获取所有可能的类组合

javascript - 如何从数据表单元格的下拉列表中获取值

javascript - 如何在用户关闭浏览器/选项卡之前激活功能?