我有一个控件,其中包含一个按钮的客户端点击事件调用的javascript函数:
OnClientClicked="ClearTree"
功能:
function ClearTree() {
var tree = $find('<%=cboOrgUnits.Items[0].FindControl("tvOrgUnits").ClientID %>');
var nodes = tree.get_nodes();
for (var i = 0; i < nodes.get_count(); i++) {
nodes.getNode(i).uncheck();
}
};
除了控件在同一页面上两次之外,一切正常。当它有2个函数'ClearTree'的实例时,似乎第二个添加的实例总是被调用。
问题是调用的ClearTree()实例可能没有引用正确的树。
这有什么可行的解决方法?
以下是标记的其余部分:
<telerik:RadComboBox ID="cboOrgUnits" runat="server" Width="400px" ShowToggleImage="True" Style="vertical-align: middle;" EmptyMessage="Choose organisation units to group by" ExpandAnimation-Type="None" CollapseAnimation-Type="None">
<HeaderTemplate>
<div>
<span class="right" style="margin:2px"><telerik:RadButton ID="rbClear" runat="server" Text="Clear" Visible="True" OnClientClicked="ClearTree" AutoPostBack="False"/></span>
<span class="right" style="margin:2px"><telerik:RadButton ID="rbDone" runat="server" Text="Done" Visible="True" OnClick="rbDone_Click"/></span>
<div class="clear"></div>
</div>
</HeaderTemplate>
<ItemTemplate>
<div>
<telerik:RadTreeView ID="tvOrgUnits" runat="server" CheckBoxes="true" Style="z-index: 100" CheckChildNodes="True">
<Nodes>
</Nodes>
</telerik:RadTreeView>
</div>
</ItemTemplate>
<Items>
<telerik:RadComboBoxItem Text="" />
</Items>
</telerik:RadComboBox>
答案 0 :(得分:6)
不要将控件的ClientID
嵌入到函数中,而是将其设为函数参数,然后更改OnClientClicked
以将ClientID
传递给函数。
function ClearTree(id)
{
var tree = $find(id);
// ...
}
protected override void Render(HtmlTextWriter writer)
{
rbClear.OnClientClicked = String.Format("ClearTree('{0}')", rbClear.ClientID);
base.Render(writer);
}
更新:由于rbClear
是在模板中定义的,因此您可能需要调用cboOrgUnits.FindControl("rbClear")
来获取对它的引用。