I need to display a tooltip on a disabled button and remove it on an enabled button. Currently, it works in reverse.
What is the best way to invert this behaviour?
$('[rel=tooltip]').tooltip();
_x000D_
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>_x000D_
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>_x000D_
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>_x000D_
<hr>_x000D_
<button class="btn" disabled rel="tooltip" data-title="Dieser Link führt zu Google">button disabled</button>_x000D_
<button class="btn" rel="tooltip" data-title="Dieser Link führt zu Google">button not disabled</button>
_x000D_
Here is a demo
P.S.: I want to keep the disabled
attribute.
This question is related to
javascript
jquery
html
twitter-bootstrap
twitter-bootstrap-tooltip
If it helps anyone, I was able to get a disabled button to show a tooltip by simply putting a span inside it and applying the tooltip stuff there, angularjs around it...
<button ng-click="$ctrl.onClickDoThis()"
ng-disabled="!$ctrl.selectedStuff.length">
<span tooltip-enable="!$ctrl.selectedStuff.length"
tooltip-append-to-body="true"
uib-tooltip="Select at least one thing to enable button.">
My Butt
</span>
</button>
You can simply override Bootstrap's "pointer-events" style for disabled buttons via CSS e.g.
.btn[disabled] {
pointer-events: all !important;
}
Better still be explicit and disable specific buttons e.g.
#buttonId[disabled] {
pointer-events: all !important;
}
If you're desperate (like i was) for tooltips on checkboxes, textboxes and the like, then here is my hackey workaround:
$('input:disabled, button:disabled').after(function (e) {
d = $("<div>");
i = $(this);
d.css({
height: i.outerHeight(),
width: i.outerWidth(),
position: "absolute",
})
d.css(i.offset());
d.attr("title", i.attr("title"));
d.tooltip();
return d;
});
Working examples: http://jsfiddle.net/WB6bM/11/
For what its worth, I believe tooltips on disabled form elements is very important to the UX. If you're preventing somebody from doing something, you should tell them why.
Simply add the disabled class to the button instead of the disabled attribute to make it visibly disabled instead.
<button class="btn disabled" rel="tooltip" data-title="Dieser Link führt zu Google">button disabled</button>
Note: this button only appears to be disabled, but it still triggers events, and you just have to be mindful of that.
pointer-events: auto;
does not work on an <input type="text" />
.
I took a different approach. I do not disable the input field, but make it act as disabled via css and javascript.
Because the input field is not disabled, the tooltip is displayed properly. It was in my case way simpler than adding a wrapper in case the input field was disabled.
$(document).ready(function () {_x000D_
$('.disabled[data-toggle="tooltip"]').tooltip();_x000D_
$('.disabled').mousedown(function(event){_x000D_
event.stopImmediatePropagation();_x000D_
return false;_x000D_
});_x000D_
});
_x000D_
input[type=text].disabled{_x000D_
cursor: default;_x000D_
margin-top: 40px;_x000D_
}
_x000D_
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>_x000D_
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.3.3/js/tether.min.js"></script>_x000D_
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"> _x000D_
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>_x000D_
_x000D_
_x000D_
<input type="text" name="my_field" value="100" class="disabled" list="values_z1" data-toggle="tooltip" data-placement="top" title="this is 10*10">
_x000D_
Based on Bootstrap 4
Disabled elements Elements with the disabled attribute aren’t interactive, meaning users cannot focus, hover, or click them to trigger a tooltip (or popover). As a workaround, you’ll want to trigger the tooltip from a wrapper or , ideally made keyboard-focusable using tabindex="0", and override the pointer-events on the disabled element.
<span class="d-inline-block" tabindex="0" data-toggle="tooltip" title="Disabled tooltip">
<button class="btn btn-primary" style="pointer-events: none;" type="button" disabled>Disabled button</button>
</span>
All the details here: Bootstrap 4 doc
Try this example:
Tooltips must be initialized with jQuery
: select the specified element and call the tooltip()
method in JavaScript
:
$(document).ready(function () {
$('[data-toggle="tooltip"]').tooltip();
});
Add CSS
:
.tool-tip {
display: inline-block;
}
.tool-tip [disabled] {
pointer-events: none;
}
And your html:
<span class="tool-tip" data-toggle="tooltip" data-placement="bottom" title="I am Tooltip">
<button disabled="disabled">I am disabled</button>
</span>
You can imitate the effect using CSS3.
Simply take the disabled state off the button and the tooltip doesn't appear anymore.. this is great for validation as the code requires less logic.
I wrote this pen to illustrate.
[disabled] {
&[disabled-tooltip] {
cursor:not-allowed;
position: relative;
&:hover {
&:before {
content:'';
border:5px solid transparent;
border-top:5px solid black;
position: absolute;
left: 50%;
transform: translate(-50%, calc(-100% + -5px));
}
&:after {
content: attr(disabled-tooltip);
position: absolute;
left: 50%;
transform: translate(-50%, calc(-100% + -15px));
width:280px;
background-color:black;
color:white;
border-radius:5px;
padding:8px 12px;
white-space:normal;
line-height:1;
}
}
}
}
<button type="button" class="btn btn-primary" disabled-tooltip="I am a disabled tooltip using CSS3.. You can not click this button." disabled>Primary Button</button>
For Bootstrap 3
HTML
<button
class="btn btn-success"
disabled
data-hint="Enabled">
<div class="sp-btn-overlap" data-hint="Disabled"></div>
Submit button
</button>
CSS
button { position:relative; }
.sp-btn-overlap {
position:absolute;
top:0;
left:0;
height:100%;
width:100%;
background:none;
border:none;
z-index:1900;
}
JS
$('button .sp-btn-overlap')
.popover({
trigger: 'hover',
container: 'body',
placement: 'bottom',
content: function() {
return $(this).parent().prop('disabled')
? $(this).data('hint')
: $(this).parent().data('hint');
}
});
$('button .sp-btn-overlap')_x000D_
.popover({_x000D_
trigger: 'hover',_x000D_
container: 'body',_x000D_
placement: 'bottom',_x000D_
content: function() {_x000D_
return $(this).parent().prop('disabled')_x000D_
? $(this).data('hint')_x000D_
: $(this).parent().data('hint'); }_x000D_
});
_x000D_
button {_x000D_
position:relative; /* important! */_x000D_
}_x000D_
_x000D_
.sp-btn-overlap {_x000D_
position:absolute;_x000D_
top:0;_x000D_
left:0;_x000D_
height:100%;_x000D_
width:100%;_x000D_
background:none;_x000D_
border:none;_x000D_
z-index:1900;_x000D_
}
_x000D_
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>_x000D_
_x000D_
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">_x000D_
_x000D_
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>_x000D_
_x000D_
<button disabled class="btn btn-default" data-hint="Enabled">_x000D_
<div class="sp-btn-overlap" data-hint="Disabled"></div>_x000D_
Disabled button_x000D_
</button>_x000D_
_x000D_
<button class="btn btn-default" data-hint="Enabled">_x000D_
<div class="sp-btn-overlap" data-hint="Disabled"></div>_x000D_
Enabled button_x000D_
</button>
_x000D_
This can be done via CSS. The "pointer-events" property is what's preventing the tooltip from appearing. You can get disabled buttons to display tooltip by overriding the "pointer-events" property set by bootstrap.
.btn.disabled {
pointer-events: auto;
}
I finally solved this problem, at least with Safari, by putting "pointer-events: auto" before "disabled". The reverse order didn't work.
Working code for Bootstrap 3.3.6
Javascript:
$('body').tooltip({
selector: '[data-toggle="tooltip"]'
});
$(".btn").click(function(e) {
if ($(this).hasClass("disabled")){
e.preventDefault();
}
});
CSS:
a.btn.disabled, fieldset[disabled] a.btn {
pointer-events: auto;
}
These workarounds are ugly. I've debugged the problem is that bootstrap automatically set CSS property pointer-events: none on disabled elements.
This magic property causes that JS is not able to handle any event on elements that matches CSS selector.
If you overwrite this property to default one, everything works like a charm, including tooltips!
.disabled {
pointer-events: all !important;
}
However you shouldn't use so general selector, because you will probably have to manually stop JavaScript event propagation way you know (e.preventDefault()).
You can't get the tool-tip to show on a disabled button. This is because disabled elements don't trigger any events, including the tool-tip. Your best bet would be to fake the button being disabled (so it looks and acts like its disabled), so you can then trigger the tool-tip.
Eg. Javascript:
$('[rel=tooltip].disabled').tooltip();
$('[rel=tooltip].disabled').bind('click', function(){
return false;
});
Instead of just $('[rel=tooltip]').tooltip();?
HTML:
<hr>
<button class="btn disabled" rel="tooltip" data-title="Dieser Link führt zu Google">button disabled</button>
<button class="btn" rel="tooltip" data-title="Dieser Link führt zu Google">button not disabled</button>
JSFiddle: http://jsfiddle.net/BA4zM/75/
You can wrap the disabled button and put the tooltip on the wrapper:
<div class="tooltip-wrapper" data-title="Dieser Link führt zu Google">
<button class="btn btn-default" disabled>button disabled</button>
</div>
If the wrapper has display:inline
then the tooltip doesn't seem to work. Using display:block
and display:inline-block
seem to work fine. It also appears to work fine with a floated wrapper.
UPDATE Here's an updated JSFiddle that works with the latest Bootstrap (3.3.6). Thanks to @JohnLehmann for suggesting pointer-events: none;
for the disabled button.
This is what myself and tekromancr came up with.
Example element:
<a href="http://www.google.com" id="btn" type="button" class="btn btn-disabled" data-placement="top" data-toggle="tooltip" data-title="I'm a tooltip">Press Me</a>
note: the tooltip attributes can be added to a separate div, in which the id of that div is to be used when calling .tooltip('destroy'); or .tooltip();
this enables the tooltip, put it in any javascript that is included in the html file. this line might not be necessary to add, however. (if the tooltip shows w/o this line then don't bother including it)
$("#element_id").tooltip();
destroys tooltip, see below for usage.
$("#element_id").tooltip('destroy');
prevents the button from being clickable. because the disabled attribute is not being used, this is necessary, otherwise the button would still be clickable even though it "looks" as if it is disabled.
$("#element_id").click(
function(evt){
if ($(this).hasClass("btn-disabled")) {
evt.preventDefault();
return false;
}
});
Using bootstrap, the classes btn and btn-disabled are available to you. Override these in your own .css file. you can add any colors or whatever you want the button to look like when disabled. Make sure you keep the cursor: default; you can also change what .btn.btn-success looks like.
.btn.btn-disabled{
cursor: default;
}
add the code below to whatever javascript is controlling the button becoming enabled.
$("#element_id").removeClass('btn-disabled');
$("#element_id").addClass('btn-success');
$('#element_id).tooltip('destroy');
tooltip should now only show when the button is disabled.
if you are using angularjs i also have a solution for that, if desired.
In my case, none of the above solutions worked. I found that it's easier to overlap the disabled button using an absolute element as:
<div rel="tooltip" title="I workz" class="wrap">
<div class="overlap"></div>
<button>I workz</button>
</div>
<div rel="tooltip" title="Boo!!" class="wrap poptooltip">
<div class="overlap"></div>
<button disabled>I workz disabled</button>
</div>
.wrap {
display: inline-block;
position: relative;
}
.overlap {
display: none
}
.poptooltip .overlap {
display: block;
position: absolute;
height: 100%;
width: 100%;
z-index: 1000;
}
Source: Stackoverflow.com