jQuery:暂时删除HOVER上的元素TITLE属性



我创建了工具提示来替换默认的浏览器"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属性时阅读该属性并将其用于工具提示
  • 您可能应该使用mouseentermouseleave,而不是mouseovermouseout。如果具有标题的元素具有子元素,则希望鼠标进入/移出子元素时工具提示继续显示

这样的东西怎么样?

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);
        }
    }

最新更新