無効なボタンでブートストラップツールチップを有効にする方法は?


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ボタンを無効にしたまま、同時にクリックイベント時にツールチップを表示したい。
Lorraine Bernard

2
これはOPの助けにはなりませんが、将来の訪問者は '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年に働いたので、それは受け入れられた答えです。それ以来、物事は変わっており、主にフィドルで使用される外部リソースです。ブートストラップcdnに新しいURLを追加しましたが、コードは同じです。
mihai

3
Bootstrapバージョン4.1のこれに対する更新された修正を入手できますか?
Jason Ayer 2018年

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正常に動作するようです。フローティングラッパーでも問題なく動作するようです。

更新これは、最新のブートストラップ(3.3.6)で動作する更新されたJSFiddleです。pointer-events: none;無効なボタンを提案してくれた@JohnLehmannに感謝します。

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


5
これはドキュメントが示唆していることであり、ここで提案されているインラインブロックトリックを使用すると機能します!
Devil's Advocate

4
ただし、ボタンがボタングループの一部である場合、ボタンをラップすると美学が失われます:(とにかくこの問題をbtn-groupsで克服するには?
Cody

2
コーディ、btnグループの場合、ラップできないか、正しくレンダリングされないことがわかりました。pointer-eventsを 'auto'に設定し(念のため、 "div.btn-group> .btn.disabled {pointer-events:auto;}"でターゲットを設定します)、ボタンのonclickイベントもフックしました。単にfalseを返します。ハックを感じましたが、私たちのアプリではうまくいきました。
Michael

3
これはブートストラップ3.3.5では機能しないようです。JSFiddle
2015

18
ブートストラップ3.3.5の場合は、.btn-default [disabled] {pointer-events:none;も追加します。}
ジョンレーマン

111

これはCSSを介して行うことができます。「pointer-events」プロパティは、ツールチップの表示を妨げているものです。ブートストラップで設定された「pointer-events」プロパティをオーバーライドすることで、無効なボタンにツールチップを表示できます。

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

1
余談ですが、これはIE 11以降でのみ機能します。他のほとんどすべての最近のブラウザーはしばらくの間それをサポートしています。参照:caniuse.com/#feat=pointer-events
Neil Monroe

11
これは[disabled]ボタンでは機能しないようです。また、Bootstrap(2.3.2)がソース内の任意の場所でポインターイベントを割り当てることも確認できません。
kangax 2014年

1
@kangax正解です。これは、bs 'disabled'クラスによって無効にされたボタンに対してのみ機能します。Balexandの回答(stackoverflow.com/a/19938049/1794871)は、この場合に最適です。ご指摘いただきありがとうございます。
Gene Parcellano、2014年

6
bootstrap3 Angularアプリで、このスタイルを適用した後、無効化されたボタンがクリック可能になりました
Dimitri Kopriwa

3
これをbtnクラスのアンカーで使用しようとしました。それ無効になっているように見え、ツールチップは機能しましたが、リンクをクリックできました(不可能であるべきです)。
OlleHärstedt16年

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
で焼くべき何かのためのどのような悪夢:(
Devil's Advocate

1
これはうまく機能しますが、入力位置がウィンドウサイズに基づいて変化する場合(フォーム要素がラップ/移動する場合など)、$(window).resizeに処理を追加してツールチップdivを移動する必要があります。そうしないと、それらが表示されます。間違った場所に。私はここからCMSの答えと組み合わせることをお勧めします:stackoverflow.com/questions/2854407/...
knighter

6

これらの回避策は醜いです。私が問題をデバッグしたのは、ブートストラップがCSSプロパティのポインターイベントを自動的に設定することです。

この魔法のプロパティにより、JSはCSSセレクターに一致する要素のイベントを処理できなくなります。

このプロパティをデフォルトのプロパティに上書きすると、ツールチップを含め、すべてがチャームのように機能します。

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

ただし、一般的なセレクターは使用しないでください。JavaScriptイベントの伝播を手動で停止する必要があるためです(e.preventDefault())。


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ゴミ!もちろん、無効になっているボタンのツールヒントを取得できます。
スターカーズ2014

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

CSSを介して、無効化されたボタンのBootstrapの「pointer-events」スタイルを単にオーバーライドできます。

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

明示的にして特定のボタンを無効にする方が良いです。

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

1
働きました!ありがとうございました!
VedranMandić16年

@VedranMandićを助けてくれてうれしい:)
Ben Smith

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>

注:tooltip属性を別のdivに追加できます。このdivのIDは、.tooltip( 'destroy');を呼び出すときに使用されます。または.tooltip();

これにより、ツールチップが有効になり、htmlファイルに含まれている任意のJavaScriptに挿入されます。ただし、この行は追加する必要がない場合があります。(ツールチップにこの行が表示されない場合は、含めないでください)

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

ツールチップを破棄します。使用方法については、以下を参照してください。

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

ボタンがクリックできないようにします。無効化された属性が使用されていないため、これは必要です。そうしないと、ボタンが無効になっているように見えても、ボタンは引き続きクリック可能です。

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

ブートストラップを使用すると、クラス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')私のために働きます。
Sam Kah Chiin 2017

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

ブートストラップ4に基づく

無効化された要素無効化された属性を持つ要素はインタラクティブではありません。つまり、ユーザーが要素にフォーカスしたり、ホバーしたり、クリックしてツールチップ(またはポップオーバー)をトリガーしたりすることはできません。回避策として、ラッパーまたはからツールチップをトリガーし、理想的にはtabindex = "0"を使用してキーボードフォーカス可能にし、無効化された要素のpointer-eventsをオーバーライドします。

<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
投稿をありがとう、私はこの設定を見落としていたと信じることができます。
Edd

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で解決し、「無効」の前に「ポインターイベント:自動」を配置しました。逆の順序は機能しませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.