jQuery UI 工具提示不支持 html 内容

Posted

技术标签:

【中文标题】jQuery UI 工具提示不支持 html 内容【英文标题】:Jquery UI tooltip does not support html content 【发布时间】:2013-03-21 23:25:43 【问题描述】:

今天,我用 jQuery 1.9.1 升级了我所有的 jQuery 插件。我开始使用带有 jquery.ui.1.10.2 的 jQueryUI 工具提示。一切都很好。但是当我在内容中使用 html 标记时(在我应用工具提示的元素的 title 属性中),我注意到不支持 HTML。

这是我的工具提示截图:

如何在 1.10.2 中使 HTML 内容与 jQueryUI 工具提示一起使用?

【问题讨论】:

这是你升级后刚刚坏掉的东西吗?在 jQuery 1.9.1、jQuery UI 1.9.2 jsfiddle.net/2n3DL/1 中对我来说似乎工作正常 嗯。这是个好主意。如果你让我,我可以再问一个问题吗?好的,我有一个工具提示图标,它有一个名为“工具提示”的类,如下所示: great HTML工具提示文本!">我怎样才能这样使用?最好的问候。 查看 metadepts 更新了 jquery ui 1.10.2 here 和 jquery 1.9.1。它仍然有效。 @phobos:不,它没有。工具提示中有<b></b> 标签。 将鼠标悬停在“一些输入”上(直接返回 HTML 内容的工具提示可以正常工作)。我知道 OP 的问题有点不清楚,但我假设他或她在 title 属性中使用 HTML,从 1.10 开始不受支持。 【参考方案1】:

编辑:由于这是一个受欢迎的答案,我添加了@crush 在下面的评论中提到的免责声明。如果您使用此解决方法,be aware that you're opening yourself up for an XSS vulnerability。仅当您知道自己在做什么并且可以确定属性中的 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/

【讨论】:

唯一的问题是它绕过了jQuery开始在标题属性中转义HTML的原因。 @eidylon Putting HTML within the title attribute is not valid HTML and we are now escaping it to prevent XSS vulnerabilities。在安德鲁的回答中,标题仍然必须包含 HTML,这是无效的。 您可以在 title 属性中包含内容的文本部分,然后在您的内容回调中构建周围的 HTML 位来解决这个问题(只要您知道在初始化时会是什么) 这个答案有很多赞成票。但我发现 Minh 的回答 [***.com/a/28941759/1063730] 更准确。引用与您相同的票证,但使用内容选项而不是在标题标签中推送完整的 html。【参考方案2】:

而不是这个:

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

使用它以获得更好的性能

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

【讨论】:

是的,性能更好,因为我只有几个带有工具提示的元素【参考方案3】:

我用自定义数据标签解决了这个问题,因为无论如何都需要一个标题属性。

$("[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 标准,并且工具提示仅针对想要的标签显示。

【讨论】:

【参考方案4】:

您也可以通过使用 CSS 样式完全不使用 jQueryUI 来实现这一点。请参阅下面的 sn-p:

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>

第一个跨度用于显示文本,第二个跨度用于隐藏文本,当您将鼠标悬停在其上时会显示。

【讨论】:

【参考方案5】:

要扩展上面@Andrew Whitaker 的回答,您可以将工具提示转换为标题标签中的 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>

【讨论】:

【参考方案6】:

来自http://bugs.jqueryui.com/ticket/9019

将 HTML 放在 title 属性中不是有效的 HTML,我们是 现在转义它以防止 XSS 漏洞(请参阅#8861)。

如果您的工具提示中需要 HTML,请使用内容选项 - http://api.jqueryui.com/tooltip/#option-content.

尝试使用javascript设置html工具提示,见下文

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

【讨论】:

可能是由于 jQuery 版本过时,但是:我需要在 .selector 所指的元素上添加一个空的标题标签!【参考方案7】:

为了避免在title属性中放置HTML标签,另一种解决方案是使用markdown。例如,您可以使用 [br] 表示换行符,然后在内容函数中执行简单的替换。

在title属性中:

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

在您的内容功能中:

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

【讨论】:

【参考方案8】:

另一种解决方案是抓取title标签内的文本,然后使用jQuery的.html()方法来构造工具提示的内容。

$(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/

【讨论】:

【参考方案9】:
$(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/

【讨论】:

【参考方案10】:

只要我们使用 jQuery (> v1.8),我们就可以使用 $.parseHTML() 解析传入的字符串。

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

我们将解析传入字符串的属性以查找不愉快的内容,然后将其转换回 jQuery 可读的 HTML。这样做的好处是,当它到达解析器时,字符串已经连接起来,所以如果有人试图将脚本标签拆分成单独的字符串并不重要。如果您无法使用 jQuery 的工具提示,这似乎是一个可靠的解决方案。

【讨论】:

【参考方案11】:

你可以修改源代码'jquery-ui.js',找到这个用于获取目标元素的title属性内容的默认函数。

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>

【讨论】:

【参考方案12】:

以上解决方案都不适合我。这个对我有用:

$(document).ready(function()

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

【讨论】:

【参考方案13】:

HTML 标记

类“.why”的工具提示控件和类“.customTolltip”的工具提示内容区

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

【讨论】:

【参考方案14】:

替换 \n 或转义的 &lt;br/&gt; 可以解决问题,同时保持 HTML 的其余部分转义:

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

【讨论】:

【参考方案15】:

在工具提示选项中添加 html = true

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

更新这与 jQuery ui 工具提示属性无关 - 在 bootstrap ui 工具提示中是正确的 - 我的错!

【讨论】:

对不起,这对我不起作用。官方文档中也没有提到“html”选项。 这是引导 2.3 工具提示而不是 jquery-ui 工具提示 工具提示没有 prop "html"

以上是关于jQuery UI 工具提示不支持 html 内容的主要内容,如果未能解决你的问题,请参考以下文章

Jquery UI 工具提示不显示在任何东西上

是否可以在 jquery 函数中为 JQuery UI 工具提示设置不同的 UI 主题

工具基于jQuery的UI框架jQuery EasyUI 1.4发布

如何检查 JQuery UI 工具提示?

点击后jQuery UI Tooltip不会消失

jquery Bootstrap工具提示标题回调函数未执行