Як увімкнути підказку 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
Це не допоможе ОП, але майбутнім відвідувачам може бути вдячно знати, що атрибут 'readonly' схожий (хоч і не тотожний) і не блокує події користувачів, як миші.
Чак

Відповіді:


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


4
Це прийнята відповідь, оскільки вона працювала в 2012 році, коли на неї відповіли. З того часу все змінилося, головним чином, зовнішні ресурси, використані у скрипці. Я додав нові URL-адреси до bootstrap cdn, код все одно той же.
mihai

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, який працює з останніми завантажувальними програмами (3.3.6). Дякуємо @JohnLehmann за пропозицію pointer-events: none;щодо кнопки вимкнено.

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


5
Це те, що пропонують документи, і це працює, якщо ви використовуєте запропонований тут фокус вкладеного блоку!
Адвокат диявола

4
Однак якщо ваша кнопка входить до групи кнопок, то при накручуванні кнопки скидається ваша естетика :( У будь-якому разі, щоб подолати цю проблему для btn-groups?
Cody

2
Коді, для btn-груп я виявив, що ви не можете їх обернути, інакше вони не отримають правильно. Я встановив покажчик події на "auto" (якраз націлений на: "div.btn-group> .btn.disabled {pointer-events: auto;}" на всякий випадок), а також підключив подію onclick кнопки так він просто повертає помилкове. Відчув себе хакі, але це працювало для нашого додатка.
Майкл

3
Схоже, це не працює в завантажувальній версії 3.3.5. JSFiddle
байтований

18
Для завантажувальної версії 3.3.5 також додайте .btn-default [вимкнено] {pointer-events: none; }
Джон Леманн

111

Це можна зробити за допомогою CSS. Властивість "покажчика-події" - це те, що перешкоджає появі підказки. Ви можете отримати відключені кнопки для відображення підказки, змінивши властивість "покажчик-події", встановлену bootstrap.

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

1
Лише бічна примітка, це працює лише для IE в 11 або вище. Практично всі інші сучасні браузери підтримували це деякий час. Дивіться: caniuse.com/#feat=pointer-events
Нейл Монро

11
Схоже, це не працює на [disabled]кнопках. Також не бачите Bootstrap (2.3.2), який призначає події-покажчики в будь-якому місці джерела.
кенгукс

1
@kangax Ви маєте рацію, це працюватиме лише для кнопок, вимкнутих через клас bs 'disabled'. Відповідь Balexand ( в stackoverflow.com/a/19938049/1794871 ) буде працювати краще в цьому випадку. Дякуємо, що вказали на це.
Джин Парчеллано

6
У кутовому додатку bootstrap3 після застосування цього стилю кнопку відключення тепер можна натискати
Димитрій Копріва

3
Я намагався використовувати це на якорі з класом btn. Це виглядало відключеним, і підказка працювала, але я міг натиснути на посилання (це не можливо).
Olle Härstedt

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. Якщо ви заважаєте комусь щось робити, то слід сказати їм, чому.


1
Це має бути правильна відповідь. Мені це зовсім не здається хокеєм :)
Старкерс

5
Який кошмар для чогось, що слід запікати :(
Адвокат Чорта

1
Це працює добре, але якщо ваші позиції введення змінюються залежно від розміру вікна (наприклад, якщо ваші елементи форми обертаються / переміщуються), вам потрібно буде додати деяку обробку на $ (window). в неправильному місці. Я рекомендую комбінуючи з відповіддю CMS, звідси: stackoverflow.com/questions/2854407 / ...
knighter

6

Ці обходи некрасиві. Я налагоджував проблему в тому, що завантажувальна програма автоматично встановлює вказівники подій властивості CSS : жодні для відключених елементів.

Ця магічна властивість призводить до того, що JS не в змозі обробляти будь-яку подію на елементах, що відповідають селектору CSS.

Якщо ви замініть цю властивість за замовчуванням, все працює як шарм, включаючи підказки!

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

Однак ви не повинні використовувати такий загальний селектор, тому що вам, ймовірно, доведеться вручну зупинити поширення подій JavaScript способом, який ви знаєте ( напр., По умолчанню ( ).


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

Демо


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
@Adam Utter сміття! Звичайно, ви можете отримати підказку інструменту на відключеній кнопці!
Старкерс

5

Спробуйте цей приклад:

Підказки повинні бути ініціалізовані 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>

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, в якому ідентифікатор цього div повинен використовуватись при виклику .tooltip ('знищити'); або .tooltip ();

це дозволяє підказку, помістити її в будь-який JavaScript, який входить у файл html. однак цей рядок, можливо, не потрібно буде додавати. (якщо підказка показує без цього рядка, тоді не турбуйтеся, включаючи його)

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

знищує підказку, див. нижче про використання.

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

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

$("#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, у мене також є рішення для цього, якщо потрібно.


Я зіткнувся з деякою проблемою під час використання 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

Елементи з обмеженими можливостями Елементи з відключеним атрибутом не є інтерактивними, тобто користувачі не можуть зосередитись, навести курсор або натиснути на них, щоб запустити підказку (або перенести перехід). Як вирішення, вам потрібно буде запустити підказку із обгортки або, в ідеалі, орієнтовану на клавіатуру, використовуючи 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


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

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

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

<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". Зворотний порядок не працював.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.