我有这段代码
$('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( '选择'); 这太奇怪了......有些建议吗?
答案 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使用delegate
(live
的变体根植于委托的根源是什么一个特定的元素)。
偏离主题:除非您看到原始代码存在性能问题,否则缓存可能不是您的朋友 - 缓存是内存使用(和复杂性)之间的权衡)与执行速度相比,最好只在遇到有形问题时才使用它。但我假设你这样做是有原因的,因此上面的建议。