Hoje, eu atualizei todos os meus plug-ins jQuery com jQuery 1.9.1. E comecei a usar a dica de ferramenta jQueryUI com jquery.ui.1.10.2. Tudo estava bom. Mas quando usei tags HTML no conteúdo (no title
atributo do elemento ao qual estava aplicando a dica de ferramenta), percebi que não há suporte para HTML.
Esta é uma captura de tela da minha dica:
Como posso fazer o conteúdo HTML funcionar com a dica de ferramenta jQueryUI em 1.10.2?
jquery
html
jquery-ui
jquery-ui-tooltip
Andrew Whitaker
fonte
fonte
<b></b>
tags na dica de ferramenta.title
atributo, que não é compatível desde o 1.10.Respostas:
Edit : Uma vez que esta se tornou uma resposta popular, estou adicionando o aviso de que @crush mencionou em um comentário abaixo. Se você usar essa solução alternativa, esteja ciente de que está se abrindo para uma vulnerabilidade de XSS . Use esta solução apenas se você souber o que está fazendo e tiver certeza do conteúdo HTML no atributo.
A maneira mais fácil de fazer isso é fornecer uma função para a
content
opção que substitui o comportamento padrão:$(function () { $(document).tooltip({ content: function () { return $(this).prop('title'); } }); });
Exemplo: http://jsfiddle.net/Aa5nK/12/
Outra opção seria substituir o widget de dica de ferramenta pelo seu próprio que altera a
content
opção:$.widget("ui.tooltip", $.ui.tooltip, { options: { content: function () { return $(this).prop('title'); } } });
Agora, toda vez que você ligar
.tooltip
, o conteúdo HTML será retornado.Exemplo: http://jsfiddle.net/Aa5nK/14/
fonte
Putting HTML within the title attribute is not valid HTML and we are now escaping it to prevent XSS vulnerabilities
. Na resposta de Andrew, o título ainda deve conter HTML, que é inválido.Em vez disso:
$(document).tooltip({ content: function () { return $(this).prop('title'); } });
use isso para melhor desempenho
$(selector).tooltip({ content: function () { return this.getAttribute("title"); }, });
fonte
Eu resolvi isso com uma tag de dados personalizada, porque um atributo de título é necessário de qualquer maneira.
$("[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"); } });
Assim, ele está em conformidade com o html e as dicas de ferramentas são mostradas apenas para as tags desejadas.
fonte
Você também pode conseguir isso completamente sem jQueryUI usando estilos CSS. Veja o snippet abaixo:
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 </b> a tooltip<br/> <b>This is </b> another tooltip<br/> </span> </a> <br/>Move the mousepointer to the tooltip headline above. </div>
O primeiro intervalo é para o texto exibido, o segundo intervalo para o texto oculto, que é mostrado quando você passa o mouse sobre ele.
fonte
Para expandir a resposta de @Andrew Whitaker acima, você pode converter sua dica de ferramenta em entidades html dentro da tag de título para evitar colocar HTML bruto diretamente em seus atributos:
$('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="<div>check out these kool <i>italics</i> and this <span style="color:red">red text</span></div>">Hover Here</div>
Na maioria das vezes, a dica de ferramenta é armazenada em uma variável php de qualquer maneira, então você só precisa:
<div title="<?php echo htmlentities($tooltip); ?>">Hover Here</div>
fonte
Para evitar colocar tags HTML no atributo title, outra solução é usar markdown. Por exemplo, você pode usar [br] para representar uma quebra de linha e, em seguida, realizar uma substituição simples na função de conteúdo.
No atributo title:
"Sample Line 1[br][br]Sample Line 2"
Em sua função de conteúdo :
content: function () { return $(this).attr('title').replace(/\[br\]/g,"<br />"); }
fonte
$(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); } } }); });
obrigado pela postagem e solução acima.
Eu atualizei um pouco o código. Espero que isso possa ajudá-lo.
http://jsfiddle.net/pragneshkaria/Qv6L2/49/
fonte
Enquanto estivermos usando jQuery (> v1.8), podemos analisar a string de entrada com $ .parseHTML ().
$('.tooltip').tooltip({ content: function () { var tooltipContent = $('<div />').html( $.parseHTML( $(this).attr('title') ) ); return tooltipContent; }, });
Vamos analisar o atributo da string de entrada em busca de coisas desagradáveis e, em seguida, convertê-lo de volta em HTML legível por jQuery. A beleza disso é que, no momento em que atinge o analisador, as strings já estão concatenadas, então não importa se alguém está tentando dividir a tag do script em strings separadas. Se você está travado usando as dicas de ferramentas do jQuery, esta parece ser uma solução sólida.
fonte
De http://bugs.jqueryui.com/ticket/9019
Tente usar javascript para definir dicas de ferramentas html, veja abaixo
$( ".selector" ).tooltip({ content: "Here is your HTML" });
fonte
Você pode modificar o código-fonte 'jquery-ui.js', encontrar esta função padrão para recuperar o conteúdo do atributo de título do elemento de destino.
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(); },
mude para
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(); },
portanto, sempre que você quiser exibir dicas de html, apenas adicione um atributo ignoreHtml = 'false' em seu elemento html de destino; como isso
<td title="<b>display content</b><br/>other" ignoreHtml='false'>display content</td>
fonte
outra solução será pegar o texto dentro da
title
tag e usar o.html()
método do jQuery para construir o conteúdo da dica de ferramenta.$(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); } } }); });
Exemplo: http://jsfiddle.net/hamzeen/0qwxfgjo/
fonte
Nenhuma das soluções acima funcionou para mim. Este funciona para mim:
$(document).ready(function() { $('body').tooltip({ selector: '[data-toggle="tooltip"]', html: true }); });
fonte
Html Markup
Controle de dica de ferramenta com classe ".why" e Área de conteúdo de dica de ferramenta com classe ".customTolltip"
$(function () { $('.why').attr('title', function () { return $(this).next('.customTolltip').remove().html(); }); $(document).tooltip(); });
fonte
Substituir o
\n
ou o escapado<br/>
resolve o problema, enquanto mantém o resto do HTML escapado:$(document).tooltip({ content: function() { var title = $(this).attr("title") || ""; return $("<a>").text(title).html().replace(/<br *\/?>/, "<br/>"); }, });
fonte
adicione html = true às opções de dica de ferramenta
$({selector}).tooltip({html: true});
A atualização
não é relevante para a propriedade de dica de ferramenta da interface do usuário do jQuery - é verdade na dica de ferramenta da interface do usuário de bootstrap - que pena!
fonte