我目前正在使用 jquery 的Tipsy插件来显示轻量级工具提示。效果很好,适用于非嵌套元素。
可以说我有:
<span>
abc
<span>def</span>
ghi
</span>
我在每个跨度标签上都有一个悬停事件,当我尝试将鼠标悬停在内部跨度标签上时,我得到了奇怪的结果。我只希望它显示实际悬停的元素。没有其他的。
我怎样才能做到这一点?
Tipsy 被设计成一个开箱即用的简单插件。尽管有一些可配置的设置,但它们可能无法涵盖所有用例。
但是,它确实提供了一个 api ( $(el).tipsy(methodName)
),这使它在某种程度上具有可扩展性。通过使用它的 api,您可以根据自己的规则
强制执行行为(例如 a )。show/hide
这是我编写此解决方法的方法:
$('span')
// init tipsy
.tipsy({
title : function(){
return $(this).data('tipsy-title');
}
})
// overwrite the triggering logic
.on('mousemove', function(e){
// prevent the event from bubbling up
e.stopPropagation();
// force a hide on other targeted elements (suchas the span parent)
$('span').not(this).tipsy('hide');
// force a show on this element (such as thespan parent)
$(this).tipsy('show');
});
您可以通过单击这个 fiddle来查看上面的代码。
更新
我已经更新了代码以适应您的 html 标记:
var $tips = $('.backref_hover')
.tipsy()
.on('mousemove', function(e){
// prevent the event from bubbling up
e.stopPropagation();
// force a hide on other targeted elements (such as the span parent)
$tips.not(this).trigger('mouseleave');
// force a show on this element (such as thespan parent)
$(this).tipsy('show');
});
这是在线演示。
更新 #2 这是一个适用于动态添加跨度的演示:
$('.backref_hover').tipsy({live:true});
$('body').on('mousemove', '.backref_hover', function(e){
// prevent the event from bubbling up
e.stopPropagation();
e.stopImmediatePropagation();
// force a hide on other targeted elements (such as the span parent)
$('.backref_hover').not(this).trigger('mouseleave');
// force a show on this element (such as thespan parent)
$(this).tipsy('show');
});
@Lindrian:我在评论中所说的只是(取自jQuery 文档):
从 jQuery 1.7 开始,不推荐使用 .live() 方法。使用 .on() 附加事件处理程序。
这个例子说明了如何使用on
委托事件而不是live
.
也可以在这里看到行动。
如果您控制 html,如何标记span
您想要工具提示的特定内容?你可以这样做class
:
<span>
[unknown number of spans]
<span class="use-tooltip" title="Backreference x: y">def</span>
[unknown number of close spans]
</span>
你的插件调用将是:
$('.use-tooltip').tipsy();
我使用了一段时间的 gion_13s 解决方案。但事实证明,对较大数据集的浏览器/cpu 要求很高。根据他的代码,我想出了一个更好的解决方案:
$('body').on('mousemove', '.backref_hover', function(e){
// prevent the event from bubbling up
e.stopPropagation();
e.stopImmediatePropagation();
// force a hide on other targeted elements (such as the span parent)
$(this).parent().children('.backref_hover').not(this).trigger('mouseleave');
// force a show on this element (such as thespan parent)
$(this).tipsy('show');
});
据我了解您的问题,您可以通过修改 Tipsy 插件来解决此问题。您可以将自己的自定义选项添加到参数(例如hideParentTip: true
),即:
$('span span').tipsy({hideParentTip: true});
然后你需要修改插件本身。就行了153
,你需要在后面加上下一个代码function enter() {
,即:
function enter() {
if (options.hideParentTip) $(this).parent().trigger(eventOut);
希望有帮助。让我知道如果它不会
嘿,你可以试试这样的..
$(function(){
$('body').children('span').tipsy(
});
看看它是否有效.. 我认为它会选择所有 span 标签留下它的 children 。