使用 jquery 切换 LinkBut​​ton 的启用/禁用状态

Posted

技术标签:

【中文标题】使用 jquery 切换 LinkBut​​ton 的启用/禁用状态【英文标题】:Toggling enabled/disabled state of a LinkButton using jquery 【发布时间】:2012-10-21 05:20:20 【问题描述】:

我有一个需要使用 jquery 启用或禁用的 LinkBut​​ton(最初禁用),但似乎使用我正在使用的方法禁用按钮会删除 href 属性,所以当我重新启用它时,按钮看起来已启用,但无法点击。

<asp:LinkButton Id="lbSave" runat="server" Text="Save" Enabled="False" ClientIDMode="Static" />

Disable:
$('#lbSave').attr('disabled', 'disabled');

Enable:
$('#lbSave').removeAttr('disabled');

启用/禁用链接按钮的正确方法是什么?

【问题讨论】:

FWIW 禁用锚客户端 与禁用服务器端相同(通过服务器端禁用呈现的 html 不同)您无法通过以下方式可靠地阻止锚操作设置 disabled 属性客户端,我建议使用不同类型的 html 元素或完全从锚中删除 href。 【参考方案1】:

问题是客户端浏览器中控件的 ID 不是 lbSave,但 WebForms 会将其分解为 ctl00_nameofanynestedaspnetcontainercontrols_morenestedcontainernames_lbSave.

Praveen 建议的解决方法是,不要尝试通过 id 查找控件,而是给它一个唯一的类名 - 网络表单不会破坏 - 瞧,问题就解决了。

另一种方法是让 asp.net 在您的标记中为您插入正确的 id:

启用: $('# lbSave.ClientID %>').attr('disabled', '');

禁用: $('# lbSave.ClientID %>').removeAttr('disabled');

(如果您使用的是 Asp.Net 4 WebForms,则此页面 http://weblogs.asp.net/scottgu/archive/2010/03/30/cleaner-html-markup-with-asp-net-4-web-forms-client-ids-vs-2010-and-net-4-0-series.aspx 为您提供了另一种更简单的解决方案)。

但是如果你在 Asp.Net 4 中做新项目,你真的很想使用 Asp.Net MVC,所有这些问题都会消失。

【讨论】:

这实际上不是问题,因为我有 ClientIDMode="Static" (为简单起见,这里没有包括,对此感到抱歉)。我的 jquery 代码能够找到我的链接按钮,所以那里没有问题。事实上,它确实会切换按钮的启用/禁用“外观”。问题是当它启用时,我仍然无法点击它,因为它已经失去了它的 href 属性。 完全同意 MVC 的评论。不幸的是,我正在处理一个较旧的项目。 明白了。您必须将 Enabled="False" 更改为 Enabled="True"。如果你试试这个: 您会看到 serverside enabled=false 的作用远不止设置 disabled 属性。要禁用该按钮,请先在客户端执行。【参考方案2】:

您可以执行以下操作:

<asp:LinkButton Id="lbSave" runat="server" Text="Save" Enabled="False" CssClass="lbSave" />

禁用:

$(".lbSave").attr("disabled", "disabled");

启用:

$(".lbSave").removeAttr("disabled");

希望这有帮助!

【讨论】:

对不起,我刚刚意识到我在描述中颠倒了(现在编辑),但实际上你在这里发布的是我目前所拥有的。启用它不会放回 href。谢谢! 尝试将链接按钮的属性记录到控制台,或者只是在禁用前后做一个“警报”;这告诉我们确切的问题。我认为除了您在此处显示的 jquery 之外,还有其他问题。 查看源代码,当我将链接按钮设置为 Enabled=False 时,链接按钮没有 href 属性。所以 jquery 工作正常,因为它不知道 href 属性的开头。所以问题仍然存在,是否可以使用 jquery 切换 ASP.NET LinkBut​​ton 状态。 好的,想通了。我必须在页面加载时启用 LinkBut​​ton,使用 jquery 保存 href 属性,然后使用 jquery 禁用 linbutton。每次我重新启用时,我都必须把 href 放回去。感谢您的帮助。【参考方案3】:

试试这个链接disable a hyperlink using jQuery

你可以试试

$('#').bind('click', false);

启用

$('#').unbind('click', false);

【讨论】:

【参考方案4】:

在 ASP.NET LinkBut​​ton 上设置 Enabled=False 会删除 href 属性,因此 jquery 永远无法重新启用它。所以这里有一个适合我的解决方案:

In javascript:
$(document).ready(function() 
  _href = $('#lbSave').attr('href');
  $('#lbSave').attr('disabled', 'disabled');
  $('#lbSave').removeAttr('href');
);

Disable:
$('#lbSave').attr('disabled', 'disabled');
$('#lbSave').removeAttr('href');

Enable:
$('#lbSave').removeAttr('disabled');
$('#lbSave').attr('href', _href);

【讨论】:

以上是关于使用 jquery 切换 LinkBut​​ton 的启用/禁用状态的主要内容,如果未能解决你的问题,请参考以下文章

回发前在 Jquery LinkBut​​ton 中验证表单(使用 Html Validate)

asp.net LinkBut​​ton OnClick 未使用 href 触发

为啥 GridView 中的 LinkBut​​ton 不会引发其 OnClick 事件?

如何让任何 asp:LinkBut​​ton 看起来像一个按钮

UpdatePanel 中 ListView 中的 LinkBut​​ton 导致完全回发

基于LinkBut​​ton在另一个页面上创建SQL语句