jQuery Tipsy不适用于jQuery.each()和live:true

注意:这个问题被标记为已解决一次,但它发现升级到最新的jQuery只修复了一个问题。 有关剩余问题,请参阅下面的更新问题。

大家好,

我刚刚遇到了jQuery.Tipsy的一个奇怪的问题。

这是一个简化的演示小提琴: http : //jsfiddle.net/6nWtx/7/

正如您所看到的,最后添加的a.tipsy2元素并没有得到提示。 .tipsy2元素在jQuery.each()函数中被提示,此时我遇到了问题。 没有each()它的工作原理。 不幸的是,在调用.each() ,我需要.each()迭代元素来做其他一些事情。

有什么建议吗?

这是Tipsy的源代码: https : //github.com/jaz303/tipsy/blob/master/src/javascripts/jquery.tipsy.js

恕我直言,问题是使用jQuery.each()和Tipsy选项live:true

更新:

在调用.tipsy()之前我想做的其他事情是检查一些可选配置。

例如: Help"

在这个例子中,我将向Tipsy添加以下选项: delayIn:1000如果没有与元素关联的delayed类,则此参数将为delayIn:0

使用相同的逻辑,我也想指定以下类: show-top, show-left, show-right, show-bottom ,名为gravity的Tipsy选项。

示例: Help"

完整代码:

 $(".tipsyfy").each(function () { var a = "s", b = 0; if ($(this).hasClass("show-left")) a = "w"; else if ($(this).hasClass("show-down")) a = "n"; else if ($(this).hasClass("show-right")) a = "e"; if ($(this).hasClass("delayed") && $(this).attr("data-delayIn") != null) b = $(this).attr("data-delayIn"); $(this).tipsy({ gravity: a, fade: true, live: true, delayIn: b }) }) 

这是一个完整的 jsFiddle演示,包含我想要做的所有事情: http : //jsfiddle.net/xmLBG/1/

如果你使用jQuery 1.7.1而不是1.6.4它将工作。 也许这个实时function依赖于旧版本的某些东西,或者一些尚未实现的function。

更新:根据我的理解,您希望使用.tipsyfy类调用每个元素调用.tipsyfy插件,现在显示或将来添加。 您不希望(或不能)在插入之前显式调用它。 您正试图使用​​插件的live选项来实现这一目标。 是对的吗?

如果是这种情况,我可以提供解决方法。 我尝试使用on (因为jQuery的live不推荐)将一些代码绑定到load事件,但是它没有用,所以我将它绑定到mouseenter并检查插件是否已经为该元素构建。 如果没有,它会构建它并重新触发事件。

 $(document).on("mouseenter", ".tipsyfy", function(e) { if ( !$(this).data("tipsy") ) { e.preventDefault(); var a = "s", b = 0; if ($(this).hasClass("show-left")) a = "e"; else if ($(this).hasClass("show-down")) a = "n"; else if ($(this).hasClass("show-right")) a = "w"; if ($(this).hasClass("delayed") && $(this).attr("data-delayIn") != null) b = $(this).attr("data-delayIn"); $(this).tipsy({ gravity: a, fade: true, live: true, delayIn: b }).trigger("mouseenter"); return false; } }); 

jsFiddle的实例 。

对于小优化,如果.tispsyfy类的唯一目的是指示插件创建,并且之后不需要它,则可以在重新触发mouseenter之前将其删除。 这样就不会一遍又一遍地调用检查代码:

 $(this).tipsy({...}).removeClass("tipsyfy").trigger("mouseenter"); 

据我所知,您不需要迭代节点列表。 对你来说看起来像是醉了 (看到这个jsfiddle ,在第一个列表中,每个元素都有自己的工具提示(1,2,3)。

KooiInc是对的,

 TipsyLink TipsyLink TipsyLink 

 $(".tipsy1").tipsy({live:true,fade:true}); $(".tipsy2").tipsy({live:true}); $("#add").click(function() { $("#container").append('TipsyLink'); }); 

那会很好

我的猜测是,Tipsy使用某种直接映射到结果,而不是使用live (在1.6中)或更新版本的jQuery。
因此,当您尝试将插件应用于具有类tipsy2的链接时,它无法找到任何内容(导致您在代码的稍后阶段将其添加到DOM)。 最简单的解决方法就是在稍后阶段运行tipsy函数,也许是在document.ready

 // this works $(".tipsy1").tipsy({live:true,fade:true}); // add new tipsy element (ok) $(document.body).append('AjaxTipsy1
'); // add new tipsy element (not ok) $(document.body).append('TipsyLink'); $(document).ready(function () { $(".tipsy2").each(function(){ // I'm doing some other logic here before I call .tipsy() $(this).tipsy({live:true,fade:true}); }) });

http://jsfiddle.net/8dg6S/7/

你不能这样做吗? 这是你要问的。

 $(".tipsy1,.tipsy2").tipsy({live:true,fade:true}); $(".tipsy2").each(function() { //do your stuff });