实时函数内的jquery变量不起作用

时间:2010-10-15 21:33:31

标签: jquery jquery-selectors

我有这段代码

$('ul.fonts li', '#wizard').live('click', function(e){
$('ul.fonts li', '#wizard').removeClass('selected');
$(this).addClass('selected');
$('blockquote').css('font-family', $(this).find('a').attr("class") )
e.preventDefault();
})

我尝试优化此代码,将选择器存储在变量中。

var $fonts_links = $('ul.fonts li', '#wizard')
$fonts_links.live('click', function(e){
$fonts_links.removeClass('selected');
$(this).addClass('selected');
$('blockquote').css('font-family', $(this).find('a').attr("class") )
e.preventDefault();
})

除第三行外,它有效。 `$ fonts_links.removeClass( '选择'); 这太奇怪了......有些建议吗?

1 个答案:

答案 0 :(得分:4)

你说“它有效,除了[for]第三行。”但你还没有说 它不起作用。

但是由于live的重点是处理你动态更改DOM,你可能不希望在这种情况下缓存选择器的结果:如果你在你之后添加更多的列表项缓存结果,它们将不会被添加到您缓存的jQuery实例中,因此当处理程序下次运行时,您最终会错过那些(不从它们中删除“选定”类)。如果这就是你所看到的......

如果wizard元素稳定(非动态),您可以这样做:

var $wizard = $('#wizard');
$wizard.delegate('ul.fonts li', 'click', function(e){
    var $this = $(this);
    $wizard.find('ul.fonts li').removeClass('selected');
    $this.addClass('selected');
    $('blockquote').css('font-family', $this.find('a').attr("class") )
    e.preventDefault();
});

这样,你只是缓存了稳定位,而且你明确告诉jQuery使用delegatelive的变体根植于委托的根源是什么一个特定的元素)。

偏离主题:除非您看到原始代码存在性能问题,否则缓存可能不是您的朋友 - 缓存是内存使用(和复杂性)之间的权衡)与执行速度相比,最好只在遇到有形问题时才使用它。但我假设你这样做是有原因的,因此上面的建议。

相关问题