这是预期的。TB tooltip
/popover
根据相关元素计算它们的位置offsetWidth
和offsetHeight
。Option 没有这样的属性,从来没有,所以 apopover
总是会以相对于最body
左边/顶部的东西结束。
但是select
,您可以为其自身放置一个弹出框。绑定mouseover
选择,从中显示一个弹出框,其中填充了option
被悬停的数据属性。
HTML,已清理rel="popover"
和"data-original-title"
<select size="4" id="testList">
<option value="1" data-title="This is item 1." data-content="Lots of stuff to say 1" style="color:red;">Item 1</option>
<option value="2" data-title="This is item 2." data-content="Lots of stuff to say 2" style="color:green;">Item 2</option>
<option value="3" data-title="This is item 3." data-content="Lots of stuff to say 3" style="">Item 3</option>
<option value="4" data-title="Blah" data-content="Lots of stuff to say 4" style="color:orange;">Item 4</option>
</select>
绑定鼠标悬停,收集选项数据属性,显示弹出框
$("#testList").on('mouseover', function(e) {
var $e = $(e.target);
if ($e.is('option')) {
$('#testList').popover('destroy');
$("#testList").popover({
trigger: 'manual',
placement: 'right',
title: $e.attr("data-title"),
content: $e.attr("data-content")
}).popover('show');
}
});
一些清理,所以当我们离开选择时弹出框消失
$("#testList").on('mouseleave', function(e) {
$('#testList').popover('destroy');
});
不认为它可以为选项列表做得更好:) 您可能会遇到template
困难,迫使弹出窗口或多或少地通过其索引跟随每个选项的垂直位置。
分叉代码http://jsfiddle.net/mM8sx/
更新- Windows 上的 IE 和 Chrome 问题。
我看到了一些对此答案的引用,指出它在 Windows 上的 IE 和 Chrome 中不起作用。这是因为在 Windows 上,<option>
元素根本不接收鼠标事件。这是上述答案的“破解”,使其成为“跨浏览器”。
在 Windows 上使用 Chrome、FF、IE 和 Safari 成功测试。Ubuntu 上的 Chrome、FF 和 Opera。这个想法是<option>
通过基于鼠标事件clientY
/选项的高度计算索引来定位正确的鼠标移动(而不是鼠标悬停)。
$("#testList").on('mousemove', function(e) {
if (!isWindows) {
var $e = $(e.target);
} else {
var newIndex = Math.floor(e.clientY/optionHeight);
if (newIndex === index) return;
index = newIndex;
$e = $(this).find('option:eq('+index+')');
}
if ($e.is('option')) {
$('#testList').popover('destroy');
$("#testList").popover({
trigger: 'manual',
placement: 'right',
title: $e.attr("data-title"),
content: $e.attr("data-content")
}).popover('show');
}
});
有关详细信息,请参见小提琴 -> http://jsfiddle.net/LfrPs/