2

我已经用谷歌搜索死了,找到了很多“答案”,但没有一个对我有用,所以也许你们聪明的人可以给我一个“明确”的答案?

我有一个 Javascript 函数:

function enableSaveLink() {
    document.getElementById('<%= btnSaveLink.ClientID %>').removeAttribute('disabled');
}  

这很好用,但显然它是硬编码的,可以在我的页面上启用特定控件。我想要的是能够从页面上的任何控件调用此函数,并将我想要启用的控件的名称作为变量传递。所以,在一个理想的世界里,我的 Javascript 函数应该是这样的:

function enableControl(ctl) {
    document.getElementById(ctl).removeAttribute('disabled');
}  

我会这样称呼它:

<asp:button id="btnTestButton" runat="server" Text="Click Me" onclientclick="enableControl('txtTestTextbox') />
<asp:button id="txtTestTextbox" runat="server" enabled="false />

我知道我传递控件名称的方式永远行不通,但我尝试以各种不同的方式传递它,但没有任何工作,所以这只是为了说明。谁能告诉我如何真正做到这一点?

4

4 回答 4

3

您需要使用控件的ClientID属性。

这将有助于:

<asp:button id="btnTest" runat="server" Text="Click Me" 
            onclientclick="enableControl('<%= lblTest.ClientID %>') />
于 2012-08-16T11:39:43.573 回答
1

使用this参考(更多信息在这里):

<asp:button id="btnTest" runat="server" Text="Click Me" onclientclick="enableControl(this);" />

然后在你的脚本中:

function enableSaveLink(elem) {
    elem.removeAttribute('disabled');
}

在这里,您将调用函数的对象的引用传递给函数,然后您可以只在元素上设置属性,而不是在 DOM 中查找它。


编辑- 刚刚意识到您的预期用途是什么。如果您希望在单击时从禁用的元素触发事件,那么您不能从该元素执行此操作。它需要从其他一些启用的元素处理。如果您打算在单击时禁用元素,则上述方法可以正常工作 - 但在单击时不启用元素。


编辑- 只是为了配合我的评论,如果你有这样的统一结构(即所有输入都有相应的标签 - 甚至按钮),那么:

<div>
    <label onclick="activateSibling(this);">Input One:</label>
    <input type="text" />
</div>

你可以试试这个:

function activateSibling(label) {
    label.nextSibling.removeAttribute("disabled");
}

我制作了一个jsFiddle 来展示我在 jQuery 中的概念,它似乎工作正常。


编辑- 好的,最后一个想法。自定义属性呢。target您可以向包含您要启用的 Id 的可点击元素添加一个属性,如下所示:

<label target="active_me" onclick="activate(this);">Click to activate</label>

<input type="text" id="active_me" disabled="disabled" />

还有你的脚本:

function activate(label) {
    var inputId = this.getAttribute("target");
    var input = document.getElementById(inputId);
    input.removeAttribute("disabled");
}

虽然,它开始感觉我们正在与技术作斗争,而且我们离ctrlInput.ClientID. 但我想这会让你的标记更清晰一些,并为你提供一个可以整体绑定的函数。

于 2012-08-16T11:39:49.767 回答
1

好的,我已经破解了。可能有不止一种方法可以做到这一点,但这相当优雅。

我的 Javascript 函数:

    function enableControl(ctl) {
        document.getElementById(ctl).removeAttribute('disabled');
    }

我的 ASP.NET 标记:

<asp:Button ID="btnTestButton" runat="server" Text="Click to enable" OnClientClick="enableControl('txtTestTextbox');" />
<asp:TextBox ID="txtTestTextBox" runat="server" enabled="false" ClientIDMode="Static" />

关键是 ClientIDMode 属性,当设置为静态时,意味着控件的客户端 ID 在呈现时将与您在标记中提供的 ID 匹配。如果它在命名容器中,您可能需要将其包含在函数调用中传递的变量中。有关 ClientIDMode 的更多信息,请参见此处

无论如何,这对我有用!谢谢大家的意见。

于 2012-08-16T14:42:13.523 回答
0

ClientID用于获取对 javascript 的服务器端控制。

var element=document.getElementById('<%=lblTest.ClientID%>');
于 2012-08-16T12:23:14.033 回答