Jquery:现在不存在的元素的选择器,但将来会存在吗?

时间:2012-08-31 09:32:05

标签: jquery asp.net jquery-selectors

在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一样的替代方案?

3 个答案:

答案 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