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}); }) });
你不能这样做吗? 这是你要问的。
$(".tipsy1,.tipsy2").tipsy({live:true,fade:true}); $(".tipsy2").each(function() { //do your stuff });