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

171

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

Каков наилучший способ инвертировать это поведение?

$('[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>

Вот демо

PS: я хочу сохранить disabledатрибут.

Лорейн Бернард
источник
кнопка, которую нужно отключить, отключена ...
KoU_warch
@EH_warch Я хочу оставить кнопку отключенной, но в то же время отображать всплывающую подсказку о событии щелчка.
Лорейн Бернард
2
Это не поможет ОП, но будущие посетители могут оценить, что атрибут «только для чтения» похож (хотя и не идентичен) и не блокирует пользовательские события, такие как наведение мыши.
Чак

Ответы:

20

Вот некоторый рабочий код: 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атрибут при включении / отключении кнопки.

Mihai
источник
4
Это принятый ответ, потому что он работал в 2012 году, когда ему ответили. С тех пор все изменилось, в основном внешние ресурсы, используемые в скрипке. Я добавил новые URL-адреса для начальной загрузки CDN, код остается прежним.
Михай
3
Могу ли я получить обновленное исправление для Bootstrap версии 4.1?
Джейсон Айер
258

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

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

balexand
источник
5
Это то, что предлагают документы, и это работает, если вы используете трюк со встроенным блоком, предложенный здесь!
Адвокат дьявола
4
Однако, если ваша кнопка является частью группы кнопок, то ее обертывание лишает вас эстетики :( В любом случае, чтобы решить эту проблему для btn-groups?
Cody
2
Коди, для btn-групп я обнаружил, что ты не можешь их обернуть, иначе они не будут правильно отображены. Я установил указатель-события на 'auto' (просто нацеленный на: "div.btn-group> .btn.disabled {pointer-events: auto;}" на всякий случай), а также подключил событие onclick кнопки, чтобы это просто возвращает ложь. Чувствовал себя хакером, но это работало для нашего приложения.
Майкл
3
Похоже, что это не работает в начальной загрузке 3.3.5. JSFiddle
bytesized
18
Для начальной загрузки 3.3.5 также добавьте .btn-default [отключено] {указатель-события: нет; }
Джон Леманн
111

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

.btn.disabled {
    pointer-events: auto;
}
Джин Парчелано
источник
1
Просто примечание, это работает только для IE в 11 или выше. Практически все другие современные браузеры поддерживают его некоторое время. Смотрите: caniuse.com/#feat=pointer-events
Нил Монро
11
Это не похоже на работу с [disabled]кнопками. Также не видно, как Bootstrap (2.3.2) назначает события указателя где-либо в источнике.
Кангакс
1
@kangax вы правы, это будет работать только для кнопок, отключенных с помощью класса bs 'disabled'. Ответ Балександа ( stackoverflow.com/a/19938049/1794871 ) будет работать лучше всего в этом случае. Спасибо что подметил это.
Джин Парчелано
6
В bootstrap3 угловом приложении, после применения этого стиля, кнопка отключена теперь кликабельна
Dimitri Kopriwa
3
Я пытался использовать это на якоре с классом BTN. Он выглядел отключенным, и всплывающая подсказка работала, но я мог нажать на ссылку (это не должно быть возможно).
Олле Херстедт
26

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

$('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. Если вы мешаете кому-то что-то сделать, вы должны сказать им, почему.

nolanpro
источник
1
Это должен быть правильный ответ. Мне вообще не кажется хакером :)
Старкерс
5
Какой кошмар для чего-то, что должно быть испечено в :(
Адвокат дьявола
1
Это работает хорошо, но если ваши входные позиции изменяются в зависимости от размера окна (например, если ваши элементы формы переносятся / перемещаются), вам нужно будет добавить некоторую обработку в $ (window) .resize, чтобы переместить подсказку div вокруг, иначе они появятся в неправильном месте. Я рекомендую объединиться с ответом CMS отсюда: stackoverflow.com/questions/2854407/…
knighter
6

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

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

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

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

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

lukyer
источник
6

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

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

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

vorillaz
источник
6

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

Подсказки должны быть инициализированы с помощью 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>
Денис Бубнов
источник
5

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

Например. 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/

Адам
источник
1
Я ищу решение с отключенной кнопкой.
Лорейн Бернард
1
@ Адам Абсолютный мусор! Конечно, вы можете получить подсказку на отключенной кнопке!
Старкерс
4

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

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

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

#buttonId[disabled] {
 pointer-events: all !important;
}
Бен Смит
источник
1
Работал! Спасибо!
Ведран Мандич
Рад, что смог помочь @ VedranMandić :)
Бен Смит
3

Это то, что я и 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, в котором id этого 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. Вы можете добавить любые цвета или как хотите, чтобы кнопка выглядела как отключенная. Убедитесь, что вы держите курсор: по умолчанию; Вы также можете изменить то, как выглядит .btn.btn-success.

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

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

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

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

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

user3885123
источник
Я столкнулся с некоторой проблемой при использовании destroyвсплывающей подсказки. (См. Это ) Однако $("#element_id").tooltip('disable')и $("#element_id").tooltip('enable')работа для меня.
Сэм Ка Чиин
2

Если это кому-нибудь помогло, я смог получить отключенную кнопку для показа всплывающей подсказки, просто поместив в нее промежуток и применив там всплывающую подсказку, а вокруг нее 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>
Натан Бич
источник
1
Вы великолепны. Такое простое решение.
BRT
2

На основе Bootstrap 4

Отключенные элементы Элементы с атрибутом disabled не являются интерактивными, что означает, что пользователи не могут фокусироваться, зависать или щелкать по ним, чтобы вызвать всплывающую подсказку (или всплывающее окно). В качестве обходного пути вы можете вызвать всплывающую подсказку из оболочки или, в идеале, сделать ее фокусируемой на клавиатуре с помощью 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

gon250
источник
1
Спасибо за пост, могу поверить, что я пропустил эту установку.
Эдд
1

Рабочий код для 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;
}
Nerian
источник
1

Вы можете имитировать эффект, используя 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>
кавалер
источник
1

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

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

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

мистический
источник
0

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

Джон Смит
источник
0

Для 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>

Хельги Кропп
источник
0

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

Уильям Ван Флит
источник