ascx控件两次添加到页面时调用了错误的javascript函数

本文关键字:调用 错误 函数 javascript 控件 添加 两次 ascx | 更新日期: 2023-09-27 18:22:04

我有一个控件,它包含一个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();
        }
   };

除了控件在同一页上出现两次外,其他操作都很好。当它存在时,函数"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>

ascx控件两次添加到页面时调用了错误的javascript函数

不要将控件的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);
}

UPDATE:因为rbClear是在模板中定义的,您可能需要调用cboOrgUnits.FindControl("rbClear")来获得对它的引用。