Переменная jquery внутри живой функции не работает - PullRequest
2 голосов
/ 16 октября 2010

У меня есть этот кусок кода

$('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 Ответ

4 голосов
/ 16 октября 2010

Вы сказали "Это работает, за исключением [для] третьей строки." , но вы не сказали , как это не работает.

Но поскольку весь смысл 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, коренящимся в конкретном элементе).

Не по теме : Если вы не видите проблемы с производительностью исходного кода в «дикой природе», кэширование в любом случае может не стать вашим другом - кэширование - это компромисс между использованием памяти (и сложностью).) в сравнении со скоростью выполнения, вероятно, лучше всего использовать ее только при столкновении с ощутимой проблемой.Но я предполагаю, что вы делаете это по какой-то причине, отсюда и предложение выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...