Как включить всплывающую подсказку 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="#" onclick="location.href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css'; return false;" 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>

Ответ 1

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

Ответ 2

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

<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, похоже, работает нормально. Он также отлично работает с плавающей оболочкой.

UPDATE Здесь обновлен JSFiddle, который работает с последним Bootstrap (3.3.6). Спасибо @JohnLehmann за предложение pointer-events: none; для отключенной кнопки.

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

Ответ 3

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

.btn.disabled {
    pointer-events: auto;
}

Ответ 4

Если вы отчаянно (как и я) для всплывающих подсказок на флажках, текстовых окнах и т.д., то вот мое обходное решение hackey:

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

Ответ 7

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

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

Demo

Ответ 8

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

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

Ответ 9

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

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

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

#buttonId[disabled] {
 pointer-events: all !important;
}

Ответ 10

Вот что я и 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>

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

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

добавьте код ниже, чтобы какой-либо javascript контролировал включение кнопки.

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

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

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

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

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

Ответ 16

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