JqueryUIツールチップはhtmlコンテンツをサポートしていません


86

今日、私はすべてのjQueryプラグインをjQuery1.9.1でアップグレードしました。そして、jquery.ui.1.10.2でjQueryUIツールチップを使い始めました。すべてが良かった。しかし、コンテンツで(titleツールチップを適用していた要素の属性で)HTMLタグを使用したとき、HTMLがサポートされていないことに気付きました。

これは私のツールチップのスクリーンショットです:

ここに画像の説明を入力してください

1.10.2のjQueryUIツールチップでHTMLコンテンツを機能させるにはどうすればよいですか?


1
これは、アップグレードしてから壊れたものですか?jQuery 1.9.1、jQuery UI 1.9.2 jsfiddle.net/2n3DL/1
metadept

うーん、いい考えですね。よろしければ、もう1つ質問してもいいですか。わかりました。ツールチップアイコンがあり、次のような「ツールチップ」という名前のクラスがあります。<img src = "images / info.png" class = "tooltip" title = "いくつかの<b>すばらしい</ b> HTMLツールチップテキスト! ">このように使用するにはどうすればよいですか?宜しくお願いします。

ここでjqueryui1.10.2およびjquery1.9.1で更新されたmetadeptsのフィドルを参照してください。それはまだ動作します。
SachinGutte 2013年

@phobos:いいえ、違います。<b></b>ツールチップにタグがあります。
Andrew Whitaker

1
「一部の入力」にカーソルを合わせます(HTMLコンテンツを直接返すツールチップは正常に機能します)。OPの質問が不明確であることは知っていますが、title属性にHTMLを使用していると思います。これは、1.10の時点ではサポートされていません。
Andrew Whitaker

回答:


186

編集:これは人気のある答えであることが判明したので、@ crushが以下のコメントで言及した免責事項を追加します。この回避策を使用する場合は、XSSの脆弱性にさらされていることに注意してください。あなたがいる場合のみ、このソリューションを使用して、あなたがやっていることを知っているとすることができ、特定の属性内のHTMLコンテンツの。


これを行う最も簡単な方法はcontent、デフォルトの動作をオーバーライドする関数をオプションに提供することです。

$(function () {
      $(document).tooltip({
          content: function () {
              return $(this).prop('title');
          }
      });
  });

例: http //jsfiddle.net/Aa5nK/12/

別のオプションは、contentオプションを変更する独自のウィジェットでツールチップウィジェットをオーバーライドすることです。

$.widget("ui.tooltip", $.ui.tooltip, {
    options: {
        content: function () {
            return $(this).prop('title');
        }
    }
});

これで、呼び出すたびに.tooltip、HTMLコンテンツが返されます。

例: http //jsfiddle.net/Aa5nK/14/


4
これに関する唯一の問題は、jQueryが最初にtitle属性のHTMLをエスケープし始めたまさにその理由を回避することです。
2013

4
@eidylon Putting HTML within the title attribute is not valid HTML and we are now escaping it to prevent XSS vulnerabilities。Andrewの回答では、タイトルにHTMLが含まれている必要がありますが、これは無効です。
2013年

タイトル属性にコンテンツのテキスト部分を
含め

18

これの代わりに:

$(document).tooltip({
    content: function () {
        return $(this).prop('title');
    }
});

パフォーマンスを向上させるためにこれを使用してください

$(selector).tooltip({
    content: function () {
        return this.getAttribute("title");
    },
});

ええ、より良いパフォーマンス、coz私はツールチップを備えたいくつかの要素しか持っていません
datdinhquoc 2018

完璧に動作します
Helpha

14

とにかくtitle属性が必要なので、カスタムデータタグで解決しました。

$("[data-tooltip]").each(function(i, e) {
    var tag = $(e);
    if (tag.is("[title]") === false) {
        tag.attr("title", "");
    }
});

$(document).tooltip({
    items: "[data-tooltip]",
    content: function () {
        return $(this).attr("data-tooltip");
    }
});

このように、それはhtml準拠であり、ツールチップは必要なタグに対してのみ表示されます。


5

CSSスタイルを使用することで、jQueryUIなしでこれを完全に実現することもできます。以下のスニペットを参照してください。

div#Tooltip_Text_container {
  max-width: 25em;
  height: auto;
  display: inline;
  position: relative;
}

div#Tooltip_Text_container a {
  text-decoration: none;
  color: black;
  cursor: default;
  font-weight: normal;
}

div#Tooltip_Text_container a span.tooltips {
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s linear 0.2s, opacity 0.2s linear;
  position: absolute;
  left: 10px;
  top: 18px;
  width: 30em;
  border: 1px solid #404040;
  padding: 0.2em 0.5em;
  cursor: default;
  line-height: 140%;
  font-size: 12px;
  font-family: 'Segoe UI';
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  -moz-box-shadow: 7px 7px 5px -5px #666;
  -webkit-box-shadow: 7px 7px 5px -5px #666;
  box-shadow: 7px 7px 5px -5px #666;
  background: #E4E5F0  repeat-x;
}

div#Tooltip_Text_container:hover a span.tooltips {
  visibility: visible;
  opacity: 1;
  transition-delay: 0.2s;
}

div#Tooltip_Text_container img {
  left: -10px;
}

div#Tooltip_Text_container:hover a span.tooltips {
  visibility: visible;
  opacity: 1;
  transition-delay: 0.2s;
}
<div id="Tooltip_Text_container">
  <span><b>Tooltip headline</b></span>
  <a href="#">
    <span class="tooltips">
        <b>This is&nbsp;</b> a tooltip<br/>
        <b>This is&nbsp;</b> another tooltip<br/>
    </span>
  </a>
  <br/>Move the mousepointer to the tooltip headline above. 
</div>

最初のスパンは表示されたテキスト用で、2番目のスパンは非表示のテキスト用で、カーソルを合わせると表示されます。


4

上記の@AndrewWhitakerの回答を拡張するには、ツールチップをtitleタグ内のhtmlエンティティに変換して、生のhtmlを属性に直接配置しないようにします。

$('div').tooltip({
    content: function () {
        return $(this).prop('title');
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
<div class="tooltip" title="&lt;div&gt;check out these kool &lt;i&gt;italics&lt;/i&gt; and this &lt;span style=&quot;color:red&quot;&gt;red text&lt;/span&gt;&lt;/div&gt;">Hover Here</div>

多くの場合、ツールチップはとにかくphp変数に格納されるため、必要なのは次のとおりです。

<div title="<?php echo htmlentities($tooltip); ?>">Hover Here</div>

2

タイトル属性にHTMLタグを配置しないようにするための別の解決策は、マークダウンを使用することです。たとえば、[br]を使用して改行を表し、コンテンツ関数で単純な置換を実行できます。

タイトル属性:

"Sample Line 1[br][br]Sample Line 2"

あなたのコンテンツ機能で

content: function () {
    return $(this).attr('title').replace(/\[br\]/g,"<br />");
}

1
$(function () {
         $.widget("ui.tooltip", $.ui.tooltip, {
             options: {
                 content: function () {
                     return $(this).prop('title');
                 }
             }
         });

         $('[rel=tooltip]').tooltip({
             position: {
                 my: "center bottom-20",
                 at: "center top",
                 using: function (position, feedback) {
                     $(this).css(position);
                     $("<div>")
                         .addClass("arrow")
                         .addClass(feedback.vertical)
                         .addClass(feedback.horizontal)
                         .appendTo(this);
                 }
             }
         });
     });

上記の投稿と解決策に感謝します。

コードを少し更新しました。これがお役に立てば幸いです。

http://jsfiddle.net/pragneshkaria/Qv6L2/49/


1

jQuery(> v1.8)を使用している限り、$。parseHTML()を使用して着信文字列を解析できます。

$('.tooltip').tooltip({
    content: function () {
        var tooltipContent = $('<div />').html( $.parseHTML( $(this).attr('title') ) );
        return tooltipContent;
    },
}); 

着信文字列の属性を解析して不快なものを探し、それをjQueryで読み取り可能なHTMLに変換し直します。これの利点は、パーサーにヒットするまでに文字列がすでに連結されているため、誰かがスクリプトタグを別々の文字列に分割しようとしているかどうかは関係ありません。jQueryのツールチップを使用して立ち往生している場合、これは確実な解決策のようです。


1

http://bugs.jqueryui.com/ticket/9019から

タイトル属性内にHTMLを配置することは有効なHTMLではなく、XSSの脆弱性を防ぐために現在エスケープしています(#8861を参照)。

ツールチップにHTMLが必要な場合は、コンテンツオプション(http://api.jqueryui.com/tooltip/#option-content)を使用します 。

javascriptを使用してhtmlツールチップを設定してみてください。以下を参照してください。

$( ".selector" ).tooltip({
   content: "Here is your HTML"
});

1

ソースコード「jquery-ui.js」を変更して、ターゲット要素のタイトル属性コンテンツを取得するためのこのデフォルト関数を見つけることができます。

var tooltip = $.widget( "ui.tooltip", {
version: "1.11.4",
options: {
    content: function() {
        // support: IE<9, Opera in jQuery <1.7
        // .text() can't accept undefined, so coerce to a string
        var title = $( this ).attr( "title" ) || "";
        // Escape title, since we're going from an attribute to raw HTML
        return $( "<a>" ).text( title ).html();
    },

に変更します

var tooltip = $.widget( "ui.tooltip", {
version: "1.11.4",
options: {
    content: function() {
        // support: IE<9, Opera in jQuery <1.7
        // .text() can't accept undefined, so coerce to a string
        if($(this).attr('ignoreHtml')==='false'){
            return $(this).prop("title");
        }
        var title = $( this ).attr( "title" ) || "";
        // Escape title, since we're going from an attribute to raw HTML
        return $( "<a>" ).text( title ).html();
    },

したがって、htmlのヒントを表示したいときはいつでも、ターゲットのhtml要素に属性ignoreHtml = 'false'を追加するだけです。このような <td title="<b>display content</b><br/>other" ignoreHtml='false'>display content</td>


1

別の解決策は、titleタグ内のテキストを取得し、.html()jQueryのメソッドを使用してツールチップのコンテンツを作成することです。

$(function() {
  $(document).tooltip({
    position: {
      using: function(position, feedback) {
        $(this).css(position);
        var txt = $(this).text();
        $(this).html(txt);
        $("<div>")
          .addClass("arrow")
          .addClass(feedback.vertical)
          .addClass(feedback.horizontal)
          .appendTo(this);
      }
    }
  });
});

例: http //jsfiddle.net/hamzeen/0qwxfgjo/


1

上記の解決策はどれも私にはうまくいきませんでした。これは私のために働きます:

$(document).ready(function()
{
    $('body').tooltip({
        selector: '[data-toggle="tooltip"]',
        html: true
     });
});

0

HTMLマークアップ

クラス「.why」のツールチップコントロール、およびクラス「.customTolltip」のツールチップコンテンツエリア

$(function () {
                $('.why').attr('title', function () {
                    return $(this).next('.customTolltip').remove().html();
                });
                $(document).tooltip();
            });

0

\nまたはエスケープを置き換える<br/>と、HTMLの残りの部分をエスケープしたまま、トリックが実行されます。

$(document).tooltip({
    content: function() {
        var title = $(this).attr("title") || "";
        return $("<a>").text(title).html().replace(/&lt;br *\/?&gt;/, "<br/>");
    },
});

-1

ツールチップオプションにhtml = trueを追加します

$({selector}).tooltip({html: true});

jQueryuiツールチッププロパティとは関係がないことを更新
します-ブートストラップuiツールチップでは真実です-私の悪いです!


1
申し訳ありませんが、これは私にはうまくいきませんでした。また、公式ドキュメントには「html」オプションについての言及はありません。
ワイヤーブルー2013年

1
これは、ブートストラップ用に2.3ツールチップではないjqueryの-UIツールチップである
マチェイPyszyński

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