【问题标题】:Change Bootstrap 4 tooltip template without refresh更改 Bootstrap 4 工具提示模板而不刷新
【发布时间】:2016-12-20 23:30:56
【问题描述】:

我有按钮来为项目添加书签,并且设计要求在悬停时显示在书签按钮上的工具提示。在添加书签之前,工具提示应该有一个黄色背景并说“保存”。用户点击按钮后,它应该有绿色背景(和箭头)并显示“已保存”。

Bootstrap 4 has changed some things,这使得 CSS 定位更加困难。也就是说,tooltip 元素不会出现在 DOM 中它附加到的元素之后。它出现在 DOM 的底部很远,所以 .thing--active + .tooltip 不起作用。

文本更改很容易。我更改了单击时的title 属性以及Bootstrap 4 使用的data-original-title 属性。我尝试在单击时添加data-template 值以更改保存项目后使用的工具提示模板,但似乎工具提示样式是在页面加载时设置的。我什至尝试在每次单击时运行.tooltip() 以每次重置模板。没有交易。

我曾想过使用.on('hidden.bs.tooltip', function () {}) 事件来传递新的东西,但老实说,我不确定如何开始使用它。任何想法如何在点击时进行此更改?

$( function() {
  var savedTemplate = "<div class='tooltip tooltip--active' role='tooltip'><div class='tooltip-arrow'></div><div class='tooltip-inner'></div></div>";
  $( '.js-bookmark' ).tooltip();
  var bookmarkSwap = function( $el ) {
    if ( $el.hasClass( "is-saved" ) ) {
      $el.removeClass( "is-saved" ).attr( "aria-label", "Bookmark this" ).attr( "title", "Save" )
        // `data-original-title` is set by Bootstrap tooltip.js when
        // title changes. This changes it as well.
        .attr( "data-original-title", "Save" );
      $( '.js-bookmark' ).tooltip();
    } else {
      $el.addClass( "is-saved" ).attr( "aria-label", "Bookmarked" ).attr( "title", "Saved" ).attr( "data-template", savedTemplate )
        // `data-original-title` is set by Bootstrap tooltip.js when
        // title changes. This changes it as well.
        .attr( "data-original-title", "Saved" );
      $( '.js-bookmark' ).tooltip();
    }
  };
  $( '.js-bookmark' ).click( function( e ) {
    bookmarkSwap( $( this ) );
  } );
} );
.tooltip--active .tooltip-inner { background-color: green !important; }
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.3.7/js/tether.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/js/bootstrap.min.js"></script>

<div class="card">
    <a href="#">
        <img class="card-img-top" src="http://lorempixel.com/100/100/nature/" width="100">
    </a>
    <div class="">
        <h3 class="card-title">
            <a href="#">Vendor Name</a>
        </h3>

        <p class="card-text">
            Boise, ID
        </p>
        <button class="js-bookmark save-vendor" aria-label="Bookmark" data-toggle="tooltip" data-placement="top" title="Save">☑️</button>
    </div>
</div>

【问题讨论】:

    标签: jquery twitter-bootstrap bootstrap-4 twitter-bootstrap-4


    【解决方案1】:

    最终使用aria-describedby 属性定位工具提示,该属性在您调用.tooltip() 后添加到按钮,然后我可以使用jQuery 选择工具提示并对其进行任何操作。 mouseover 监听器设置了初始样式,因为我很懒,想不出用 CSS 做的方法。

    $( function() {
      var bookmarkSwap = function( $el ) {
        if ( $el.hasClass( "is-saved" ) ) {
          $el.removeClass( "is-saved" )
            .attr( "aria-label", "Bookmark this" )
            .attr( "title", "Save" )
            .attr( "data-original-title", "Save" );
          
          var id = $el.attr("aria-describedby");
          changeTooltip(id,false);
          
        } else {
          $el.addClass( "is-saved" )
            .attr( "aria-label", "Bookmarked" )
            .attr( "title", "Saved" )
            .attr( "data-original-title", "Saved" );
            
          var id = $el.attr("aria-describedby");
          changeTooltip(id,true);
          
        }
      };
      
      var changeTooltip = function(id,saved){
        var bg = saved ? "green" : "red";
        var text = saved ? "Saved" : "Save";
        $("#"+id).find(".tooltip-inner").css("background-color",bg).text(text);
      }
      
      var bookmarks = $(".js-bookmark");
      bookmarks.tooltip();
      bookmarks.click( function( e ) {
        bookmarkSwap( $( this ) );
      } );
      
      bookmarks.mouseover( function (e) {
        var id = $(this).attr("aria-describedby");
        var saved = $(this).hasClass("is-saved");
        changeTooltip(id,saved);
        $(this).unbind("mouseover")
      })
      
      
    } );
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.3.7/js/tether.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/js/bootstrap.min.js"></script>
    
    <div class="card">
        <a href="#">
            <img class="card-img-top" src="http://lorempixel.com/100/100/nature/" width="100">
        </a>
        <div class="">
            <h3 class="card-title">
                <a href="#">Vendor Name</a>
            </h3>
    
            <p class="card-text">
                Boise, ID
            </p>
            <button class="js-bookmark save-vendor" aria-label="Bookmark" data-toggle="tooltip" data-placement="top" title="Save">☑️</button>
        </div>
    </div>

    【讨论】:

    • 谢谢,蔡斯!我删除了鼠标悬停解除绑定,以便如果有人连续多次保存和取消保存,它可以再次更改。让我知道我是否在那儿惹麻烦。但这正在起作用。
    猜你喜欢
    • 2015-08-10
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多