我创建了工具提示来替换默认的浏览器"TITLE"气泡。我读了很多线程,所有这些线程都建议我应该暂时删除mouseover
上的title
,稍后再放回。我正试图做得更糟,但我失败了。以下是我的代码,我之所以使用jQuery live
,是因为我希望稍后将效果应用于动态添加的元素:
tooltip : {
activate : function(selector){
$(selector).each(function(){
$(selector).live('mouseover',function(e){
tooltip.init(this,true,e);
});
$(selector).live('mouseout',function(e){
tooltip.init(this,false,e);
});
});
},
init : function(elem,show,e){
var title = $(elem).attr('title');
this.addTip(elem,show,title);
...
},
addTip : function(elem,show,title) {
var code = '<div class="tooltip-wrapper">'+title+'</div>';
if(show) {
$(elem).after(code);
setTimeout('$(".tooltip-wrapper").fadeIn("slow")',500);
}
else {
$(".tooltip-wrapper").remove();
}
}
}
我这样称呼这个脚本:
tooltip.activate(selector);
我遇到的另一个问题是,如果我尝试这个tooltip.activate("*");
,它会给我HIERARCHY_REQUEST_ERR: DOM Exception 3
错误,但如果我使用input
作为选择器,它会起作用。
任何输入都将不胜感激:-)
我只想指出几个问题:
- 在
each
中使用live
违背了live
的思想。each
在现有元素上循环,而不是在未来元素上循环 - 但无论如何,你的做法都是错误的。您应该删除
each
(在activate
中),因为live
已经应用于多个元素。因此,在您的情况下,如果您有N个元素,您将添加相同的事件侦听器N次 *
适用于所有元素,这可能是非常低效的。试试[title]
(适用于具有title
属性的元素)怎么样- 如果你在悬停时暂时删除了标题,那么标题就没有意义了(因为它只出现在悬停时)。如果要基于title属性创建改进的工具提示,请在第一次遇到title属性时阅读该属性并将其用于工具提示
- 您可能应该使用
mouseenter
和mouseleave
,而不是mouseover
和mouseout
。如果具有标题的元素具有子元素,则希望鼠标进入/移出子元素时工具提示继续显示
这样的东西怎么样?
addTip : function(elem,show,title) {
var code = '<div class="tooltip-wrapper">'+title+'</div>';
if(show) {
$(elem).after(code);
$(elem).removeAttr('title');
setTimeout('$(".tooltip-wrapper").fadeIn("slow")',500);
}
else {
$(".tooltip-wrapper").remove();
$(elem).attr('title',title);
}
}