【问题标题】:ASP.NET AJAX UpdatePanel scrolling problemASP.NET AJAX UpdatePanel 滚动问题
【发布时间】:2011-02-02 14:46:39
【问题描述】:

我会尽量简洁:

  1. 我有一个下拉列表,Autopostback 设置为 true
  2. 我有一个包含 Label 的 UpdatePanel。
  3. 当downdownlist选择改变时,我想更新标签。

问题:下拉列表上的焦点丢失,迫使用户单击下拉列表以将焦点重置回控件。​​

我的“解决方案”:在DropDownList_SelectionChanged事件中,将焦点设置回下拉列表:

dropdownlist1.focus()

虽然这在 IE 中效果很好,但 Firefox 和 Chrome 会更改滚动位置,以便分配焦点的控件位于浏览器窗口可见部分的底部。这通常是一个非常令人迷惑的副作用。

如何避免这种情况,使其在 FF 中像在 IE 中一样工作?

【问题讨论】:

  • 我会的,我可以立即提供赏金。我需要一个答案。我正在寻找一种不涉及放弃 UpdatePanel 控件的解决方案。

标签: asp.net ajax updatepanel focus vertical-scrolling


【解决方案1】:

通过以下 3 种方式之一尝试 MaintainScrollPositionOnPostback

  • 以编程方式 - Page.MaintainScrollPositionOnPostBack = true;
  • 页面声明 -
  • 在 web.config -

您可能还需要在 scriptmanager 声明之后添加此 javascript:

<script type="text/javascript">

var prm = Sys.WebForms.PageRequestManager.getInstance();

prm.add_beginRequest(beginRequest);

function beginRequest()
{
    prm._scrollPosition = null;
}

</script> 

【讨论】:

  • 男孩,我很兴奋——直到我尝试了它并没有用。我将它添加到项目根 web.config 中。我正在使用 VS2010 RC
  • 让我们尝试放入页面声明并在脚本管理器之后添加一些脚本(我遇到了这个问题,很糟糕,我最终让它工作了)
  • 不,这似乎没有帮助。
  • 从服务器代码中移除焦点代码。在页面加载后大约 100 毫秒在脚本中使用 setTimer 来重置焦点。 (jquery 会在这里提供帮助)
【解决方案2】:

Velika - 抱歉耽搁了。 如果您使用的是母版页,请添加:

<asp:ScriptManagerProxy runat="server" ID="smp"></asp:ScriptManagerProxy>

否则就添加

<asp:ScriptManager runat="server" id="sm" />

【讨论】:

    【解决方案3】:

    遇到了完全相同的问题并得到了答案。希望这可以帮助 : http://forums.asp.net/p/1622050/4164858.aspx#4164858

     <script type="text/javascript">  
     var xPos, yPos;  
     var postBackElement;  
    
     var prm = Sys.WebForms.PageRequestManager.getInstance();  
     prm.add_endRequest(EndRequestHandler);  
     prm.add_initializeRequest(InitializeRequest);  
    
     function EndRequestHandler(sender, args) {  
         if (postBackElement != null) {  
             document.getElementById(postBackElement.id).focus();  
         }  
     }  
     function InitializeRequest(sender, args) {    
          postBackElement = args.get_postBackElement();    
      }            
    

    【讨论】:

    【解决方案4】:

    试试这个

    <script type="text/javascript">
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        prm.add_beginRequest(beginRequest);
    
        function beginRequest() {
            prm._scrollPosition = window.top;
        }
    </script> 
    

    【讨论】:

      【解决方案5】:
      public static void SetFocusByJavaScript(Page page, string clientID)
              {
                  string uniqueScriptId = String.Concat("focusScript", clientID);
                  string scriptBody = String.Format("setTimeout(\"$get('{0}').focus();\", 100);", clientID);
                  ScriptManager.RegisterStartupScript(page, page.GetType(), uniqueScriptId, scriptBody, true);
              }
      

      这就是我解决这个问题的方法。该示例需要 jquery,但如果需要,您可以重写。基本上只是延迟焦点脚本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-07
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多