0

我有一个 jquery 选择器的有趣情况,试图在 asp.net LoginView 中找到一些东西:

假设我有 4 个控件、2 个纯 html<input>和 2 个<asp:TextBox>es。每个里面一个<asp:Loginview>

<asp:LoginView ID="LoginView1" runat="server">
    <LoggedInTemplate>
        <input type="text" id="htmlInput1" />
        <asp:TextBox id="aspTextbox1" runat="server"></asp:TextBox>
    </LoggedInTemplate>
</asp:LoginView>

<input type="text" id="htmlInput2" />
<asp:TextBox id="aspTextbox2" runat="server"></asp:TextBox>

然后假设我想对他们每个人应用一些 jquery。猜猜这 4 个中哪一个不起作用?

 <script>
         $(function () {             
             $("#htmlInput1").datepicker();
             $("#htmlInput2").datepicker();
             $("#aspTextbox1").datepicker();  
             $("#aspTextbox2").datepicker();             
         });
 </script>

由于某种原因,无法访问 LoginView 中的 asp.net 文本框。我必须先以某种方式选择 LoginView 吗?

var x = $("LoginView1")..... 
4

2 回答 2

1

这是因为服务器端标签在呈现时被赋予了唯一的标识符。如果您打开页面的呈现源,您会看到元素id已被修改为包含整个控件层次结构。因此,您的 jQuery 选择器将不再找到该元素。

但是,因为它们总是以指定的 id结尾,所以可以使用 jQueryattributeEndsWith选择器:

$('[id$="aspTextbox1"]').datepicker();

CssClass或者,为 a ofdatepicker和 do提供您想要执行此操作的所有元素:

$('.datepicker').datepicker();

这可能是实现相同目标的一种更简洁、不那么突兀的方式,因为它允许您datepicker使用一行代码在所有这些元素上调用该方法。此外,它允许您通过简单地为新元素赋予相同的类来添加更多的 datepicker 元素,而不必每次都修改 jQuery:

<asp:TextBox id="aspTextbox999" CssClass="datepicker" runat="server" />
于 2013-06-25T17:36:06.307 回答
1

原因是 ASP.NET 在运行时自动生成 ID,这与您尝试在 jQuery 中读取的不同。打开viewsource,查看生成的ID。您可以使用该 Id ,否则如果您使用的是 ASP.NET 4.0 或更高版本,我认为您可以将 Id 设置为可预测的。阅读: http ://weblogs.asp.net/asptest/archive/2009/01/06/asp-net-4-0-clientid-overview.aspx 用于 ASP.NET 控件

          $("#"+<%= Control.ClientID %>).val();
于 2013-06-25T17:36:24.987 回答