从下拉菜单中选择值时,页面滚动
本文关键字:滚动 下拉菜单 选择 | 更新日期: 2023-09-27 18:19:22
我已经成功完成了一个组织的web应用程序,它达到了预期的效果,但我注意到一个问题,并试图通过在谷歌上搜索并询问前辈来解决它,但这些都没有多大帮助。
问题:我在页面上有多个下拉列表,其中选择一个下拉列表中的值会触发另一个下拉列表的加载,即国家>城市的情况,问题是每当我点击任何值时,它都会将页面滚动到顶部,我必须一次又一次地向后滚动,这看起来很糟糕,也不专业。请帮帮我。
代码:<asp:UpdatePanel ID="updGridViewSMS" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<br />
<asp:Panel ID="pnlBoxesDropDowns" runat="server">
<label style="width:400px">Relevant Region</label>
<asp:DropDownList ID="ddlRegions" runat="server" CssClass="DropDown_Width" Width="147px" OnSelectedIndexChanged="ddlRegions_SelectedIndexChanged" AppendDataBoundItems="True" AutoPostBack="true" >
<asp:ListItem Value="-1" Selected="True">-Select-</asp:ListItem>
</asp:DropDownList>
<asp:RequiredFieldValidator ID="ReqFieldValidatorRegions" runat="server"
ControlToValidate="ddlRegions" ErrorMessage="Region is Required" InitialValue="-1"
ForeColor="Red" ValidationGroup="Complaints">Region is Required</asp:RequiredFieldValidator>
<label style="width:400px">Relevant District</label>
<asp:DropDownList ID="ddlDistricts" runat="server" CssClass="DropDown_Width" Width="147px" OnSelectedIndexChanged="ddlDistricts_SelectedIndexChanged" AutoPostBack="true">
</asp:DropDownList>
<asp:RequiredFieldValidator ID="ReqFieldValidatorDistricts" runat="server"
ControlToValidate="ddlDistricts" ErrorMessage="Region is Required" InitialValue="-1"
ForeColor="Red" ValidationGroup="Complaints">District is Required</asp:RequiredFieldValidator>
<label>Relevant P.Station</label>
<asp:DropDownList ID="ddlPoliceStations" runat="server" Width="147px" CssClass="DropDown_Width">
</asp:DropDownList>
<asp:RequiredFieldValidator ID="ReqFieldValidatorPoliceStations" runat="server"
ControlToValidate="ddlPoliceStations" ErrorMessage="Police Station is Required" InitialValue="-1"
ForeColor="Red" ValidationGroup="Complaints">Police Station is Required</asp:RequiredFieldValidator>
<label>Priority</label>
<asp:DropDownList ID="ddlPriority" runat="server">
<asp:ListItem Text="Top" Value="1"></asp:ListItem>
<asp:ListItem Text="Normal" Value="2"></asp:ListItem>
</asp:DropDownList>
</asp:Panel>
<br />
<br />
<asp:Timer runat="server" Interval="60000" ID="RefreshSmsComplaints" OnTick="RefreshSmsComplaints_Tick" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="RefreshSmsComplaints" EventName="Tick" />
</Triggers>
</asp:UpdatePanel>
请帮助。
这里的核心问题是,您将在每个下拉选择上发回服务器。这意味着网页重新加载,因为它是你的web服务器更新HTML,而不是更现代的方式来做的事情,是有javascript在客户端做。这里有一个粗糙的,不完美的,但是快速的解决方案:
在浏览器中,检查html DOM。你的每个下拉ASPX标签都应该被替换成
<select id="ctl000$ddlDistricts"...
您可以使用url标签通过将#ctl000$ddlDistricts
附加到url来滚动到该区域。由于服务器知道哪个控件被发布,它可以获得控件的客户端ID,并将其写入以下javascript(最好在页面底部)。
<script type="text/javascript">
location.href='#' + <%=PostedControl.ClientID %>
</script>
为什么这是不完美的?因为它会将页面滚动到下拉框位于浏览器顶部边缘的位置。这意味着如果用户在页面的中间位置选择下拉菜单,一旦页面重新加载,下拉菜单就会出现在顶部。然而,至少,你的下拉菜单会在你的视线之内。
你最初的问题表明,你想要的页面看起来"专业",虽然这得到的工作完成,它是不完美的,将所有的解决方案,当你处理经典的ASPX webforms风格的回发。具体来说,你的下拉菜单看起来像这样:
OnSelectedIndexChanged=MyFunction
这告诉ASPX表单,本质上,"当你呈现这个下拉控件到HTML,添加一些东西到标签,如onChange="postMyFormBackToServerCausingReloadAndPageScroll
。你真正想要的,也许是让它做onChange=GetNewDropdownFromServerAndReplaceOnPageWithoutReload
。这涉及到更多的知识,我无法在已经很长的答案中添加,但这里有一些有用的链接:
http://www.codeproject.com/Articles/691298/Creating-AJAX-enabled-web-forms(有点老了,但可能是一个很好的垫脚石)
http://www.codedigest.com/Articles/jQuery/318_Doing_AJAX_with_jQuery_in_ASPNet.aspx(这是一种稍微现代一点的方法,但是你可以自己用这个方法做更多的事情,而不是依赖于。net)
最后,完全现代的方式来做的事情,包括完全重写你的页面
http://www.codeproject.com/Articles/575397/An-Absolute-Beginners-Tutorial-on-ASP-NET-MVC-for(不确定这是否是适合你的文章,只需谷歌"。净MVC")