Как я могу повторно использовать переменную в другой области?
Я пытаюсь понять, как я могу повторно использовать переменную внутри функции, сейчас я должен поместить ее в каждую область, чтобы она работала.
Скажем, у меня есть обработчик события jQuery:
$('.button').on('click', function() {
var btn = $(this).data('button');
$(this).addClass(btn+'-activate');
}).on('mouseup', function() {
var btn = $(this).data('button');
$(this).removeClass( btn+'-activate');
}).on('mouseleave', function() {
var btn = $(this).data('button');
$(this).removeClass( btn+'-activate');
}
Как я могу повторно использовать переменную 'btn'? Когда я помещаю его в родительскую область, он больше не распознает $(this)
Ответы
Ответ 1
Другие ответы имеют немного избыточности в них. Вот как я обычно обрабатываю события, которые связаны и имеют общие переменные:
$('.button').on('click mouseup mouseleave', function(event) {
var btn = $(this).data('button');
switch(event.type) {
case 'click': {
$(this).addClass(btn+'-activate');
break;
}
case 'mouseup':
case 'mouseout':
case 'mouseleave': {
$(this).removeClass(btn+'-activate');
break;
}
}
});
Прослушайте несколько событий и используйте оператор switch, чтобы определить, какое событие было вызвано.
Ответ 2
Вы можете просто перебирать кнопки, задавать переменную для каждого из них, а затем использовать переменную внутри обработчиков событий.
$('.button').each(function() {
var btn = $(this).data('button');
$(this).on('click', function() {
$(this).addClass(btn+'-activate');
}).on('mouseup mouseleave', function() {
$(this).removeClass( btn+'-activate');
});
});
Но, конечно, это не совсем то же самое, что и ваш код. Здесь мы устанавливаем значение btn
во время присоединения обработчиков, в то время как в вопросе вопроса btn
устанавливается во время вызова обработчиков. Поэтому это только допустимая альтернатива, если значение .data('button')
не предназначено для изменения.
Ответ 3
Нет специального преимущества для использования переменной. Вы можете передать функцию .removeClass()
и .addClass()
, тем самым устраняя необходимость использования переменной:
$(function() {
$('.button').on('click', function() {
$(this).addClass( function() {
return $(this).data('button') + '-activate';
});
}).on('mouseup mouseleave', function() {
$(this).removeClass( function() {
return $(this).data('button') + '-activate';
});
});
});
$(function() {
$('.button').on('click', function() {
$(this).addClass( function() {
return $(this).data('button') + '-activate';
});
}).on('mouseup mouseleave', function() {
$(this).removeClass( function() {
return $(this).data('button') + '-activate';
});
});
});
.one-activate {
background-color:black;
color:white;
}
.two-activate {
background-color:black;
color:yellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<button class="button" data-button="one">Man</button><br/>
<button class="button" data-button="two">Woman</button><br/>