I have a link button inside a <td>
which I have to disable. This works on IE but not working in Firefox and Chrome.
Structure is - Link inside a <td>
. I cannot add any container in the <td>
(like div/span)
I tried all the following but not working on Firefox (using 1.4.2 js):
$(td).children().each(function () {
$(this).attr('disabled', 'disabled');
});
$(td).children().attr('disabled', 'disabled');
$(td).children().attr('disabled', true);
$(td).children().attr('disabled', 'true');
Note - I cannot de-register the click function for the anchor tag as it is registered dynamically. AND I HAVE TO SHOW THE LINK IN DISABLED MODE.
Got the fix in css.
Above css when applied to the anchor tag will disable the click event.
For details checkout this link
You can use this to disabled the Hyperlink of asp.net or link buttons in html.
I've ended up with the solution below, which can work with either an attribute,
<a href="..." disabled="disabled">
, or a class<a href="..." class="disabled">
:CSS Styles:
Javascript (in jQuery ready):
Thanks to everyone that posted solutions (especially @AdrianoRepetti), I combined multiple approaches to provide some more advanced
disabled
functionality (and it works cross browser). The code is below (both ES2015 and coffeescript based on your preference).This provides for multiple levels of defense so that Anchors marked as disable actually behave as such. Using this approach, you get an anchor that you cannot:
How to
Include this css, as it is the first line of defense. This assumes the selector you use is
a.disabled
Next, instantiate this class on ready (with optional selector):
ES2015 Class
npm install -S key.js
Coffescript class:
You can't disable a link (in a portable way). You can use one of these techniques (each one with its own benefits and disadvantages).
CSS way
This should be the right way (but see later) to do it when most of browsers will support it:
It's what, for example, Bootstrap 3.x does. Currently (2016) it's well supported only by Chrome, FireFox and Opera (19+). Internet Explorer started to support this from version 11 but not for links however it's available in an outer element like:
With:
Workaround
We, probably, need to define a CSS class for
pointer-events: none
but what if we reuse thedisabled
attribute instead of a CSS class? Strictly speakingdisabled
is not supported for<a>
but browsers won't complain for unknown attributes. Using thedisabled
attribute IE will ignorepointer-events
but it will honor IE specificdisabled
attribute; other CSS compliant browsers will ignore unknowndisabled
attribute and honorpointer-events
. Easier to write than to explain:Another option for IE 11 is to set
display
of link elements toblock
orinline-block
:Note that this may be a portable solution if you need to support IE (and you can change your HTML) but...
All this said please note that
pointer-events
disables only...pointer events. Links will still be navigable through keyboard then you also need to apply one of the other techniques described here.Focus
In conjunction with above described CSS technique you may use
tabindex
in a non-standard way to prevent an element to be focused:I never checked its compatibility with many browsers then you may want to test it by yourself before using this. It has the advantage to work without JavaScript. Unfortunately (but obviously)
tabindex
cannot be changed from CSS.Intercept clicks
Use a
href
to a JavaScript function, check for the condition (or the disabled attribute itself) and do nothing in case.To disable links do this:
To re-enable them:
If you want instead of
.is("[disabled]")
you may use.attr("disabled") != undefined
(jQuery 1.6+ will always returnundefined
when the attribute is not set) butis()
is much more clear (thanks to Dave Stewart for this tip). Please note here I'm using thedisabled
attribute in a non-standard way, if you care about this then replace attribute with a class and replace.is("[disabled]")
with.hasClass("disabled")
(adding and removing withaddClass()
andremoveClass()
).Zoltán Tamási noted in a comment that "in some cases the click event is already bound to some "real" function (for example using knockoutjs) In that case the event handler ordering can cause some troubles. Hence I implemented disabled links by binding a return false handler to the link's
touchstart
,mousedown
andkeydown
events. It has some drawbacks (it will prevent touch scrolling started on the link)" but handling keyboard events also has the benefit to prevent keyboard navigation.Note that if
href
isn't cleared it's possible for the user to manually visit that page.Clear the link
Clear the
href
attribute. With this code you do not add an event handler but you change the link itself. Use this code to disable links:And this one to re-enable them:
Personally I do not like this solution very much (if you do not have to do more with disabled links) but it may be more compatible because of various way to follow a link.
Fake click handler
Add/remove an
onclick
function where youreturn false
, link won't be followed. To disable links:To re-enable them:
I do not think there is a reason to prefer this solution instead of the first one.
Styling
Styling is even more simple, whatever solution you're using to disable the link we did add a
disabled
attribute so you can use following CSS rule:If you're using a class instead of attribute:
If you're using an UI framework you may see that disabled links aren't styled properly. Bootstrap 3.x, for example, handles this scenario and button is correctly styled both with
disabled
attribute and with.disabled
class. If, instead, you're clearing the link (or using one of the others JavaScript techniques) you must also handle styling because an<a>
withouthref
is still painted as enabled.Accessible Rich Internet Applications (ARIA)
Do not forget to also include an attribute
aria-disabled="true"
together withdisabled
attribute/class.Try the element:
Disabling a link works for me in Chrome: http://jsfiddle.net/KeesCBakker/LGYpz/.
Firefox doesn't seem to play nice. This example works:
Note: added a 'live' statement for future disabled / enabled links.
Note2: changed 'live' into 'on'.