Вы сказали "Это работает, за исключением [для] третьей строки." , но вы не сказали , как это не работает.
Но поскольку весь смысл 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
, коренящимся в конкретном элементе).
Не по теме : Если вы не видите проблемы с производительностью исходного кода в «дикой природе», кэширование в любом случае может не стать вашим другом - кэширование - это компромисс между использованием памяти (и сложностью).) в сравнении со скоростью выполнения, вероятно, лучше всего использовать ее только при столкновении с ощутимой проблемой.Но я предполагаю, что вы делаете это по какой-то причине, отсюда и предложение выше.