0

在 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()已经通过 using 完成了,我也可以通过使用.on()or完成.live()。问题就像Felix Kling评论一样,他一针见血,(阅读他的评论和我对他的回复)。问题是页面启动时 DOM中不存在该元素。它是在用户单击showReport按钮时动态构建的,并且 gridview 会填充数据,这就是创建此元素的位置。虽然我描述的方法Yoeri可能/可能不起作用,但我想知道是否有任何可能的方法(当然是 jQuery!)我可以选择这种情况下描述的这样一个元素,还是我唯一的选择是寻找类似Yoeri答案的替代方案?

4

3 回答 3

1

为什么不在自定义属性或类上选择 chkAll 框?

我经常使用 action 属性将事件绑定到...只是为了保持所有事物的一致性并与 css 类分开(这不是为了将行为绑定到它,而是为了样式;-)

<input type="check" action="checkAll"
...
$('input[action=checkAll]').delegate(....) 

至于添加action属性,可以看这里...(避免添加额外的span元素) adding-custom-attributes-to-an-aspcheckbox-control

于 2012-08-31T09:39:17.483 回答
1

在 WebForms 中工作时,我经常使用带有选择器的结尾。在您的情况下,您正在寻找的选择器将显示为:

$("input[id$='checkAll']")

或者,如果您使用的是 WebForms 4.0,您可以将复选框上的客户端 id 模式设置为静态,并且您可以获得一个相对健全的 id 来硬编码作为您的选择器。

于 2012-08-31T20:56:58.260 回答
0

只需运行构建并从后面的 .net 代码运行 jquery 代码。

此 Gist 中的代码将有助于使其快速简单:https ://gist.github.com/3415335

于 2012-08-31T09:39:30.340 回答