您无法以可移植的方式禁用链接。您可以使用以下技术之一(每种技术都有其自身的优缺点)。
CSS 方式
当大多数浏览器支持它时,这应该是正确的方式(但稍后请参见):
a.disabled {
pointer-events: none;
}
比如,Bootstrap 3.x就是这样做的。目前(2016年),它只有在Chrome、FireFox和Opera(19+)中得到良好的支持。Internet Explorer从版本11开始支持此功能,但不适用于链接,但可以在外部元素中使用,例如:
span.disable-links {
pointer-events: none;
}
使用:
<span class="disable-links"><a href="#">...</a></span>
解决方法
我们可能需要为pointer-events: none
定义一个CSS类,但如果我们重用disabled
属性而不是CSS类会怎样呢?严格来说,<a>
不支持disabled
,但浏览器不会对未知属性抱怨。使用disabled
属性,IE将忽略pointer-events
,但它将尊重IE特定的disabled
属性;其他符合CSS的浏览器将忽略未知disabled
属性并尊重pointer-events
。比解释更容易写:
a[disabled] {
pointer-events: none;
}
对于IE 11,另一个选择是将链接元素的display
设置为block
或inline-block
:
<a style="pointer-events: none; display: inline-block;" href="#">...</a>
请注意,如果您需要支持IE(且可以更改HTML),则这可能是一种可移植的解决方案,但……
所有这些说法请注意,
pointer-events
仅禁用……指针事件。
链接仍然可以通过键盘进行导航,那么您还需要应用此处描述的其他技术之一。
焦点
与上述CSS技术相结合,您可以以非标准的方式使用
tabindex
来防止元素被聚焦:
<a href="#" disabled tabindex="-1">...</a>
我从未检查过它与许多浏览器的兼容性,因此在使用之前您可能希望自行测试。它的优点是可以在没有JavaScript的情况下工作。不幸的是(但显然)
tabindex
无法从CSS更改。
拦截点击事件
使用href
到JavaScript函数,检查条件(或禁用属性本身),并在这种情况下什么也不做。
$("td > a").on("click", function(event){
if ($(this).is("[disabled]")) {
event.preventDefault();
}
});
禁用链接,请执行以下操作:
$("td > a").attr("disabled", "disabled");
重新启用它们:
$("td > a").removeAttr("disabled");
如果你想使用
.is("[disabled]")
的替代方法,你可以使用
.attr("disabled") != undefined
(jQuery 1.6+ 在属性未设置时始终返回
undefined
),但是
is()
更加清晰易懂(感谢 Dave Stewart 提供的提示)。请注意,这里我在非标准方式下使用了
disabled
属性,如果您关心此事,请将属性替换为类,并使用
.hasClass("disabled")
替换
.is("[disabled]")
(使用
addClass()
和
removeClass()
添加和删除)。
Zoltán Tamási 在评论中指出,“在某些情况下,点击事件已经绑定到一些‘真实’函数上(例如使用knockoutjs)。在这种情况下,事件处理程序的顺序可能会引起一些麻烦。因此,我通过将一个返回false的处理程序绑定到链接的touchstart
、mousedown
和keydown
事件来实现禁用链接。它有一些缺点(它将防止在链接上开始的触摸滚动)”,但处理键盘事件也有防止键盘导航的好处。
请注意,如果没有清除href
,用户仍然可以手动访问该页面。
清除链接
清除href
属性。使用此代码,您不会添加事件处理程序,而是更改链接本身。使用此代码禁用链接:
$("td > a").each(function() {
this.data("href", this.attr("href"))
.attr("href", "javascript:void(0)")
.attr("disabled", "disabled");
});
这个用来重新启用它们:
$("td > a").each(function() {
this.attr("href", this.data("href")).removeAttr("disabled");
});
个人而言,我不太喜欢这种解决方案(如果您与无效链接没有更多关联),但它可能更兼容,因为有各种方式可以跟踪链接。
虚假点击处理程序
添加/删除一个onclick
函数,在其中return false
,链接将不会被跟踪。要禁用链接:
$("td > a").attr("disabled", "disabled").on("click", function() {
return false;
});
要重新启用它们:
$("td > a").removeAttr("disabled").off("click");
我认为没有理由选择这种解决方案而不是第一个。
样式
样式甚至更简单,无论你使用什么解决方案来禁用链接,我们都添加了disabled
属性,因此您可以使用以下CSS规则:
a[disabled] {
color: gray;
}
如果您使用的是类而不是属性:
a.disabled {
color: gray;
}
如果您正在使用用户界面框架,您可能会发现
禁用链接的样式不正确。例如,Bootstrap 3.x可以处理此场景,并且按钮在具有
disabled
属性和
.disabled
类时都正确地进行了样式设置。相反,如果您清除了链接(或使用其他JavaScript技术之一),则还必须处理样式,因为没有
href
的
<a>
仍然被绘制为启用状态。
可访问的富互联网应用程序(ARIA)
不要忘记在
disabled
属性/类别中同时包含一个
aria-disabled="true"
属性。