Как включить всплывающую подсказку Bootstrap на отключенной кнопке?

Мне нужно отобразить всплывающую подсказку на отключенной кнопке и удалить ее на включенной кнопке. В настоящее время это работает в обратном порядке.

Как лучше всего изменить это поведение?

$('[rel=tooltip]').tooltip();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
<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>

Вот демонстрация

P.S .: Я хочу сохранить атрибут disabled.


person Lorraine Bernard    schedule 09.11.2012    source источник
comment
кнопка, которую нужно отключить, отключена ...   -  person KoU_warch    schedule 09.11.2012
comment
@EH_warch Я хочу, чтобы кнопка была отключена, но в то же время отображала всплывающую подсказку при событии щелчка.   -  person Lorraine Bernard    schedule 09.11.2012
comment
Это не поможет OP, но будущие посетители могут оценить, зная, что атрибут readonly похож (хотя и не идентичен) и не блокирует пользовательские события, такие как наведение курсора мыши.   -  person Chuck    schedule 28.08.2013


Ответы (19)


Вот рабочий код: http://jsfiddle.net/mihaifm/W7XNU/200/

$('body').tooltip({
    selector: '[rel="tooltip"]'
});

$(".btn").click(function(e) {
    if (! $(this).hasClass("disabled"))
    {
        $(".disabled").removeClass("disabled").attr("rel", null);

        $(this).addClass("disabled").attr("rel", "tooltip");
    }
});

Идея состоит в том, чтобы добавить всплывающую подсказку к родительскому элементу с параметром selector, а затем добавить / удалить атрибут rel при включении / отключении кнопки.

person mihai    schedule 09.11.2012
comment
Это принятый ответ, потому что он работал в 2012 году, когда на него был дан ответ. С тех пор все изменилось, в основном внешние ресурсы, используемые в скрипке. Я добавил новые URL-адреса для начальной загрузки cdn, код все тот же. - person mihai; 25.05.2017
comment
Могу ли я получить обновленное исправление этого для Bootstrap версии 4.1? - person Jason Ayer; 17.10.2018
comment
скрипка не работает в Firefox (по крайней мере) - person RASMiranda; 25.02.2021

Вы можете обернуть отключенную кнопку и поместить всплывающую подсказку на обертку:

<div class="tooltip-wrapper" data-title="Dieser Link führt zu Google">
  <button class="btn btn-default" disabled>button disabled</button>
</div>

Если в оболочке указано display:inline, всплывающая подсказка не работает. Использование display:block и display:inline-block, похоже, работает нормально. Также кажется, что он отлично работает с плавающей оберткой.

ОБНОВЛЕНИЕ Вот обновленный JSFiddle, который работает с последней версией Bootstrap (3.3.6). Спасибо @JohnLehmann за предложение pointer-events: none; для отключенной кнопки.

http://jsfiddle.net/cSSUA/209/

person balexand    schedule 12.11.2013
comment
Это то, что предлагают документы, и это работает, если вы используете трюк с встроенным блоком, предложенный здесь! - person JOATMON; 08.04.2014
comment
Однако, если ваша кнопка является частью группы кнопок, то упаковка кнопки отбрасывает вашу эстетику :( В любом случае, чтобы решить эту проблему для btn-groups? - person Cody; 04.11.2014
comment
Коди, я обнаружил, что для btn-групп их нельзя обернуть, иначе они не будут правильно отображаться. Я установил для указателей-событий значение 'auto' (просто нацелен на: div.btn-group ›.btn.disabled {pointer-events: auto;} на всякий случай), а также подключил событие onclick кнопки, чтобы он просто возвращает false. Чувствовал себя взломанным, но для нашего приложения это сработало. - person Michael; 22.06.2015
comment
В начальной загрузке 3.3.5 это не работает. JSFiddle - person bytesized; 27.07.2015
comment
Для начальной загрузки 3.3.5 также добавьте .btn-default [disabled] {pointer-events: none; } - person John Lehmann; 19.08.2015
comment
Вы должны обновить свой ответ подсказкой @JohnLehmann, чтобы он работал и с 3.3.5+. - person Hexodus; 16.02.2016
comment
Я использовал диапазон как оболочку. Работает отлично. Спасибо! - person cst1992; 16.01.2017
comment
Обратной стороной этого решения является добавление маржи, без маржи не работает :( - person lcjury; 11.02.2019
comment
Здравствуйте, я пытаюсь использовать это, чтобы исправить свою проблему, но я не знаю, где нужно установить эту часть скрипки $ (function () {$ ('. Tooltip-wrapper'). Tooltip ({position: Нижний}); }); Не могли бы вы мне помочь, пожалуйста? - person Manuela CodingPadawan; 13.02.2019

Это можно сделать с помощью CSS. Свойство "pointer-events" - это то, что предотвращает появление всплывающей подсказки. Вы можете отключить кнопки для отображения всплывающей подсказки, переопределив свойство "pointer-events", установленное при начальной загрузке.

.btn.disabled {
    pointer-events: auto;
}
person Gene Parcellano    schedule 04.04.2014
comment
Мне потребовалась вечность, чтобы понять, что bootstrap использует это свойство для отключения всплывающих подсказок на отключенных .btn-элементах. - person martin; 14.08.2014
comment
Замечу, что это работает только для IE версии 11 или выше. Практически все другие современные браузеры уже какое-то время поддерживают его. См .: caniuse.com/#feat=pointer-events - person Neil Monroe; 15.08.2014
comment
Поскольку события указателя не поддерживаются в старых версиях браузеров, отключенные кнопки будут отображать всплывающую подсказку без необходимости вносить изменения. :) - person Gene Parcellano; 15.08.2014
comment
Похоже, это не работает с [disabled] кнопками. Также не смотрите, как Bootstrap (2.3.2) назначает события указателя где-либо в источнике. - person kangax; 13.10.2014
comment
@kangax, вы правы, это будет работать только для кнопок, отключенных через класс bs 'disabled'. В этом случае лучше всего подойдет ответ Balexand (stackoverflow.com/a/19938049/1794871). Спасибо что подметил это. - person Gene Parcellano; 18.10.2014
comment
В приложении bootstrap3 angular после применения этого стиля отключенная кнопка теперь становится интерактивной. - person Dimitri Kopriwa; 11.02.2015
comment
для [disabled] кнопок используйте это: .btn[disabled]{ pointer-events: auto; } - person Esteve; 15.07.2015
comment
Безусловно, лучший ответ. Спасибо! - person Pierre; 21.08.2015
comment
Я был взволнован, когда обнаружил это, но, к сожалению, это не работает в последних сборках Firefox (40+), но отлично работает в Chrome. Мне нужно найти другое решение. - person Aaron; 17.10.2015
comment
@Aaron Я попробовал это на своем FF (41.0.2), и он отлично работает. Убедитесь, что ваш селектор достаточно конкретен, так как он может быть переопределен. #id .btn.disabled {...} или .parentclass .btn.disabled {...}. Удачи. - person Gene Parcellano; 19.10.2015
comment
Я пытался использовать это на якоре с классом btn. Он выглядел отключенным, и всплывающая подсказка работала, но я мог щелкнуть ссылку (должно быть невозможно). - person Olle Härstedt; 27.07.2016
comment
@ OlleHärstedt Я думаю, что атрибут disabled влияет только на ‹button›. Это решение будет работать только для ‹button›, вам может потребоваться найти другой способ отключить событие щелчка на ‹a›. Кто-нибудь поправьте меня, если я ошибаюсь. Спасибо. - person Gene Parcellano; 27.07.2016
comment
Для кнопок [disabled] подход .btn[disabled]{ pointer-events: auto; } не работает в IE11. Легче использовать .disabled класс css. - person kolobok; 14.12.2016
comment
В Bootstrap 4 это работает, но вы должны сделать это важным: .btn.disabled { pointer-events: auto !important; } - person Adriano Pedro; 11.12.2018

Если вы отчаянно нуждались (как и я) в всплывающих подсказках для флажков, текстовых полей и тому подобного, то вот мой обходной путь:

$('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;
});

Рабочие примеры: http://jsfiddle.net/WB6bM/11/

Как бы то ни было, я считаю, что всплывающие подсказки по отключенным элементам формы очень важны для UX. Если вы мешаете кому-то что-то сделать, вы должны объяснить им, почему.

person nolanpro    schedule 25.02.2013
comment
Это должен быть правильный ответ. Мне вообще не кажется хоккеем :) - person Starkers; 14.02.2014
comment
Какой кошмар для того, что нужно запекать :( - person JOATMON; 08.04.2014
comment
Это работает хорошо, но если ваши позиции ввода изменяются в зависимости от размера окна (например, если ваши элементы формы переносятся / перемещаются), вам нужно будет добавить некоторую обработку в $ (window) .resize для перемещения всплывающей подсказки div вокруг, или они появятся не в том месте. Я рекомендую объединить с ответом CMS отсюда: stackoverflow.com/questions/2854407/ - person knighter; 26.04.2016
comment
удивлен количеством голосов за это. Слишком много кода для чего-то, что может иметь простой обходной путь. - person Manny Alvarado; 09.10.2020

На основе Bootstrap 4

Отключенные элементы Элементы с отключенным атрибутом не являются интерактивными, то есть пользователи не могут сфокусироваться, навести на них курсор или щелкнуть по ним, чтобы вызвать всплывающую подсказку (или всплывающее окно). В качестве обходного пути вы захотите вызвать всплывающую подсказку из оболочки или, в идеале, сделать фокусировку клавиатуры с помощью tabindex = "0" и переопределить события указателя на отключенном элементе.

<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>

Все подробности здесь: Bootstrap 4 doc

person gon250    schedule 07.05.2020
comment
Спасибо за сообщение, могу поверить, что я упустил из виду эту настройку. - person Edd; 08.06.2020

Эти обходные пути уродливы. Я отладил проблему в том, что при загрузке автоматически устанавливается свойство CSS pointer-events: none для отключенных элементов.

Это магическое свойство приводит к тому, что JS не может обрабатывать какие-либо события для элементов, соответствующих селектору CSS.

Если вы замените это свойство на значение по умолчанию, все будет работать как шарм, включая всплывающие подсказки!

.disabled {
  pointer-events: all !important;
}

Однако вам не следует использовать такой общий селектор, потому что вам, вероятно, придется вручную останавливать распространение событий JavaScript известным вам способом (e.preventDefault ()).

person lukyer    schedule 01.06.2015

В моем случае ни одно из вышеперечисленных решений не помогло. Я обнаружил, что проще перекрыть отключенную кнопку, используя абсолютный элемент как:

<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;
}

Демонстрация

person vorillaz    schedule 15.01.2017

Попробуйте этот пример:

Всплывающие подсказки должны быть инициализированы с помощью jQuery: выберите указанный элемент и вызовите метод tooltip() в JavaScript:

$(document).ready(function () {
    $('[data-toggle="tooltip"]').tooltip();
});

Добавить CSS:

.tool-tip {
  display: inline-block;
}

.tool-tip [disabled] {
  pointer-events: none;
}

И ваш html:

<span class="tool-tip" data-toggle="tooltip" data-placement="bottom" title="I am Tooltip">
    <button disabled="disabled">I am disabled</button>
</span>
person Denis Bubnov    schedule 24.03.2017

Вы не можете заставить всплывающую подсказку отображаться на отключенной кнопке. Это связано с тем, что отключенные элементы не вызывают никаких событий, включая всплывающую подсказку. Лучше всего было бы имитировать отключенную кнопку (чтобы она выглядела и действовала как отключенная), чтобы затем можно было вызвать всплывающую подсказку.

Например. Javascript:

$('[rel=tooltip].disabled').tooltip();

$('[rel=tooltip].disabled').bind('click', function(){
     return false;
});

Вместо просто $('[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/

person Adam    schedule 09.11.2012
comment
Ищу решение с отключенной кнопкой. - person Lorraine Bernard; 09.11.2012
comment
@ Адам Абсолютная чушь! Конечно, вы можете получить всплывающую подсказку об отключенной кнопке! - person Starkers; 14.02.2014

Вы можете просто переопределить стиль Bootstrap «указатель-события» для отключенных кнопок с помощью CSS, например.

.btn[disabled] {
 pointer-events: all !important;
}

Лучше все же быть явным и отключить определенные кнопки, например.

#buttonId[disabled] {
 pointer-events: all !important;
}
person Ben Smith    schedule 11.01.2016
comment
Работал! Спасибо! - person Vedran Mandić; 12.10.2016
comment
Рад, что смог помочь @ VedranMandić :) - person Ben Smith; 12.10.2016

Если это кому-то поможет, я смог получить отключенную кнопку для отображения всплывающей подсказки, просто поместив в нее диапазон и применив туда всплывающие подсказки, angularjs вокруг него ...

<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>
person Nathan Beach    schedule 06.03.2020
comment
Вы молодец. Такое простое решение. - person brt; 07.05.2020

Это то, что придумали я и tekromancr.

Пример элемента:

<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>

примечание: атрибуты всплывающей подсказки могут быть добавлены в отдельный div, в котором идентификатор этого div должен использоваться при вызове .tooltip ('destroy'); или .tooltip ();

это включает всплывающую подсказку, поместите ее в любой javascript, включенный в html-файл. однако эту строку, возможно, не нужно добавлять. (если всплывающая подсказка показывает без этой строки, не беспокойтесь о ее включении)

$("#element_id").tooltip();

уничтожает всплывающую подсказку, см. использование ниже.

$("#element_id").tooltip('destroy');

предотвращает нажатие кнопки. поскольку атрибут disabled не используется, это необходимо, иначе кнопка будет по-прежнему доступна для нажатия, даже если она «выглядит» так, как будто она отключена.

$("#element_id").click(
  function(evt){
    if ($(this).hasClass("btn-disabled")) {
      evt.preventDefault();
      return false;
    }
  });

При использовании bootstrap вам доступны классы btn и btn-disabled. Переопределите их в своем собственном файле .css. вы можете добавить любые цвета или все, что хотите, чтобы кнопка выглядела в отключенном состоянии. Убедитесь, что вы держите курсор: default; вы также можете изменить внешний вид .btn.btn-success.

.btn.btn-disabled{
    cursor: default;
}

добавьте приведенный ниже код к любому сценарию javascript, который управляет включением кнопки.

$("#element_id").removeClass('btn-disabled');
$("#element_id").addClass('btn-success');
$('#element_id).tooltip('destroy');

всплывающая подсказка теперь должна отображаться только тогда, когда кнопка отключена.

если вы используете angularjs, у меня также есть решение для этого, если хотите.

person user3885123    schedule 28.07.2014
comment
Я столкнулся с проблемой при использовании destroy во всплывающей подсказке. (См. this) Однако $("#element_id").tooltip('disable') и $("#element_id").tooltip('enable') у меня работают. - person Sam Kah Chiin; 13.07.2017

Рабочий код для 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;
}
person Nerian    schedule 28.04.2016

Вы можете имитировать эффект с помощью CSS3.

Просто снимите отключенное состояние с кнопки, и всплывающая подсказка больше не появится ... это отлично подходит для проверки, поскольку код требует меньше логики.

Я написал эту ручку для иллюстрации.

подсказки для отключенных CSS3

[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>
person beau    schedule 12.02.2018

Просто добавьте к кнопке класс disabled вместо атрибута disabled, чтобы вместо этого сделать его явно отключенным.

<button class="btn disabled" rel="tooltip" data-title="Dieser Link führt zu Google">button disabled</button>

Примечание. эта кнопка только кажется отключенной, но по-прежнему запускает события, и вы просто должны помнить об этом.

person Mystical    schedule 23.09.2019

pointer-events: auto; не работает на <input type="text" />.

Я использовал другой подход. Я не отключаю поле ввода, но делаю его отключенным через css и javascript.

Поскольку поле ввода не отключено, всплывающая подсказка отображается правильно. В моем случае это было проще, чем добавлять обертку, если поле ввода было отключено.

$(document).ready(function () {
  $('.disabled[data-toggle="tooltip"]').tooltip();
  $('.disabled').mousedown(function(event){
    event.stopImmediatePropagation();
    return false;
  });
});
input[type=text].disabled{
  cursor: default;
  margin-top: 40px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.3.3/js/tether.min.js"></script>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"> 
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>


<input type="text" name="my_field" value="100" class="disabled" list="values_z1" data-toggle="tooltip" data-placement="top" title="this is 10*10">

person John Smith    schedule 20.07.2016

Для 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')
  .popover({
    trigger: 'hover',
    container: 'body',
    placement: 'bottom',
    content: function() {
      return $(this).parent().prop('disabled')
                  ? $(this).data('hint')
                  : $(this).parent().data('hint'); }
  });
button {
  position:relative; /* important! */
}

.sp-btn-overlap {
  position:absolute;
  top:0;
  left:0;
  height:100%;
  width:100%;
  background:none;
  border:none;
  z-index:1900;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

<button disabled class="btn btn-default" data-hint="Enabled">
  <div class="sp-btn-overlap" data-hint="Disabled"></div>
  Disabled button
</button>

<button class="btn btn-default" data-hint="Enabled">
  <div class="sp-btn-overlap" data-hint="Disabled"></div>
  Enabled button
</button>

person Helgi Kropp    schedule 16.05.2018

Я наконец решил эту проблему, по крайней мере, с Safari, отключив "pointer-events: auto" до ". Обратный порядок не сработал.

person William Van Fleet    schedule 19.10.2019

У меня была такая же проблема с динамическими элементами управления, поэтому я просто делаю это, устанавливая атрибуты стиля и включаю свойство только для чтения = true, когда нам нужен отключенный элемент, но показываю всплывающую подсказку, если пользователь нажимает на элементы управления кнопки ввода.

Да, отключено, остановлены все функции событий, такие как ObBlur, onClick / OnFocus. вместо строки ниже:

((document.getElmentByName ('MYINPUTBTN'). item (0))). disabled = true;

мы можем выполнить приведенный ниже код после того, как эта всплывающая подсказка будет включена в отключенных элементах кнопки ввода.

((document.getElmentByName ('MYINPUTBTN'). item (0))). setAttribute (style, background-color: # e9ecef;);

б

Надеюсь, это решит проблему.

person Ashutosh Soni    schedule 28.04.2021