在aspx页面中,有一个网格视图,它具有复选框的模板控件,类似这样
<asp:gridview .....
<columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:CheckBox ID="chkAll" runat="server"/>
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="chkSelect" runat="server"/>
</ItemTemplate>
</asp:TemplateField>
...
现在我写的是
$(#'<%=chkSelect.ClientID%>').something( function() {});
我得到一个错误,说'chkSelect在当前上下文中不存在,这很明显,因为当加载griddata时这个元素将存在,我所做的是将复选框的更改事件绑定到委托。
$("body").delegate(":checkbox", "change", function () {
custList = $(':checkbox:checked').map(function () { return $(this).closest('tr').find('.grdCustName').text() }).get();
$('#<%=hdnFromCustomer.ClientID %>').val(custList);
}
再次正常工作,问题是我需要知道是否更改了具有特定id的复选框(对于此处,chkAll
),然后选中所有复选框,全部检查不是问题,我可以用$(':checkbox').attr(checked, 'on')
之类的东西来做这件事。
但问题是,如果我写的话
$('#<%=chkAll.ClientID %>')
,它不允许我这样做,因为此复选框在启动时不存在于DOM中,但在用户点击showReport
按钮并填充网格时可用。
所以,基本上,我的问题是如何选择,或者我应该使用哪个选择器来选择DOM中的这个复选框(或任何其他元素),这个复选框不存在但将来某个时候会存在?
编辑:为了回答一些答案,问题没有约束,我已经使用delegate()
做了,我也可以使用.on()
或.live()
。问题就像Felix Kling
评论一样,他敲了敲头,(阅读他的评论和我对他的回复)。问题是在页面启动时DOM中的元素不存在。当用户单击showReport
按钮时,动态构建,并且gridview填充了数据,这是创建此元素的位置。虽然Yoeri
所描述的方法可能/可能不起作用,但我想知道是否有任何可能的方法(当然是jQuery!)我可以选择这种情况下描述的元素 ,或者我唯一的选择是寻找像Yoeri
一样的替代方案?
答案 0 :(得分:1)
为什么不在自定义属性或类上选择chkAll框?
我经常使用action属性将事件绑定到...只是为了保持所有事物的一致性并与css类分离(不是为了绑定行为而是为了样式; - )
<input type="check" action="checkAll"
...
$('input[action=checkAll]').delegate(....)
至于添加动作属性,你可以看一下......(以避免添加额外的span元素) adding-custom-attributes-to-an-aspcheckbox-control
答案 1 :(得分:1)
在WebForms中工作时,我会使用带有选择器的结尾。在您的情况下,您正在寻找的选择器将为:
$("input[id$='checkAll']")
或者,如果你使用的是WebForms 4.0,你可以将复选框上的client id mode设置为静态,你可以获得一个相对理智的硬编码ID作为你的选择器。
答案 2 :(得分:0)
只需运行构建&amp;从后面的.net代码运行jquery代码。
此要点中的代码将有助于快速和快速。简单:https://gist.github.com/3415335