今天,我用jQuery 1.9.1升级了所有jQuery插件。我开始在jQueryUI.1.10.2中使用jQueryUI工具提示。一切都很好。但是,当我在内容中使用HTML标签时(在title
我将工具提示应用到的元素的属性中),我注意到不支持HTML。
这是我的工具提示的屏幕截图:
如何使用1.10.2中的jQueryUI工具提示使HTML内容起作用?
今天,我用jQuery 1.9.1升级了所有jQuery插件。我开始在jQueryUI.1.10.2中使用jQueryUI工具提示。一切都很好。但是,当我在内容中使用HTML标签时(在title
我将工具提示应用到的元素的属性中),我注意到不支持HTML。
这是我的工具提示的屏幕截图:
如何使用1.10.2中的jQueryUI工具提示使HTML内容起作用?
<b></b>
工具提示中有标签。
title
属性中使用HTML ,而从1.10版本开始,该属性不受支持。
Answers:
编辑:由于这是一个受欢迎的答案,因此我添加了@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内容都会返回。
Putting HTML within the title attribute is not valid HTML and we are now escaping it to prevent XSS vulnerabilities
。在安德鲁的答案中,标题仍必须包含HTML,这是无效的。
代替这个:
$(document).tooltip({
content: function () {
return $(this).prop('title');
}
});
用它来获得更好的性能
$(selector).tooltip({
content: function () {
return this.getAttribute("title");
},
});
我用自定义数据标签解决了它,因为无论如何都需要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规范,并且仅针对需要的标签显示工具提示。
您也可以使用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 </b> a tooltip<br/>
<b>This is </b> another tooltip<br/>
</span>
</a>
<br/>Move the mousepointer to the tooltip headline above.
</div>
第一个跨度用于显示的文本,第二个跨度用于隐藏的文本,当您将鼠标悬停在其上时会显示。
为了扩展上述@Andrew Whitaker的答案,您可以将工具提示转换为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="<div>check out these kool <i>italics</i> and this <span style="color:red">red text</span></div>">Hover Here</div>
工具提示经常会存储在php变量中,因此您只需要:
<div title="<?php echo htmlentities($tooltip); ?>">Hover Here</div>
为了避免将HTML标签放置在title属性中,另一种解决方案是使用markdown。例如,您可以使用[br]表示换行符,然后在content函数中执行简单的替换。
在标题属性中:
"Sample Line 1[br][br]Sample Line 2"
在您的内容功能中:
content: function () {
return $(this).attr('title').replace(/\[br\]/g,"<br />");
}
$(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);
}
}
});
});
感谢您的帖子和上面的解决方案。
我已经更新了一点代码。希望这对您有帮助。
只要我们使用jQuery(> v1.8),就可以使用$ .parseHTML()解析传入的字符串。
$('.tooltip').tooltip({
content: function () {
var tooltipContent = $('<div />').html( $.parseHTML( $(this).attr('title') ) );
return tooltipContent;
},
});
我们将分析传入字符串的属性以解决不愉快的事情,然后将其转换回jQuery可读的HTML。这样做的好处是,当它到达解析器时,字符串已经连接在一起,因此,如果有人尝试将script标记拆分为单独的字符串,则没有关系。如果您对使用jQuery的工具提示感到困惑,那么这似乎是一个可靠的解决方案。
来自http://bugs.jqueryui.com/ticket/9019
将HTML放在title属性中是无效的HTML,我们现在对其进行转义以防止XSS漏洞(请参阅#8861)。
如果您的工具提示中需要HTML,请使用content选项 -http://api.jqueryui.com/tooltip/#option-content。
尝试使用javascript设置html工具提示,请参见下文
$( ".selector" ).tooltip({
content: "Here is your HTML"
});
您可以修改源代码'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>
另一个解决方案是获取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);
}
}
});
});
将html = true添加到工具提示选项
$({selector}).tooltip({html: true});
更新
它与jQuery ui工具提示属性无关-在bootstrap ui工具提示中确实如此-不好!