Вы привязываете слушателя изменений к элементу. Этот слушатель по-прежнему будет связан, независимо от того, какие переменные вы меняете дальше по пути выполнения. Вам нужно отвязать прослушиватель,
или связать с помощью jQuery's
.one
.
Обновление. Я понимаю, что .one
не совсем то, что вам нужно. Он связывает слушателя с событием, которое будет запускаться только один раз, а затем отменять регистрацию. Вам нужно что-то, что может срабатывать несколько раз, и отменить регистрацию в зависимости от состояния. Чтобы иметь возможность отменить регистрацию события, важно, чтобы ссылка была на ту же самую функцию (а не только на идентичную), поэтому вы не можете определить обработчик события inline.
Пример, который отменяет регистрацию событий может выглядеть следующим образом:
function selectChange() {
var location = $(this).val();
$('.shipping_country_code').val(location);
}
function shippingColumn() {
$('#shipping_country_code, #country_code').unbind('change', selectChange);
$(locationSelect).bind('change', selectChange);
}
Demo (я добавил класс активный для ясности).
Теперь. Легко потеряться при привязке и развязывании слушателей. Последнее, что вы хотите сделать (обычно), - это случайно зарегистрировать один и тот же прослушиватель дважды. Я бы предложил другой подход, который, как я думаю, приведет к меньшему количеству проблем по линии, где вы привязываете обработчики событий раз и навсегда, на DOMReady
, что будет всегда огонь для и элементов, а затем вы используете изменение прослушиватель, чтобы проверить вашу переменную состояния и посмотреть, нужно ли обрабатывать событие или нет.
$('#shipping_country_code, #country_code').change(function() {
if(!$(this).is(locationSelect)) return;
var location = $(this).val();
$('.shipping_country_code').val(location);
});
Demo
Вы заметите, что для случая использования вы не действительно должен использовать переменное состояние с помощью этого решения; это почти так же легко оценить, следует ли обрабатывать текущее событие, как это происходит:
$('#shipping_country_code, #country_code').change(function() {
var sameAsBilling = $('#order_shipping_same_as_billing').is(':checked');
if((this.id == 'country_code' && !sameAsBilling) ||
(this.id == 'shipping_country_code' && sameAsBilling)) return;
var location = $(this).val();
$('.shipping_country_code').val(location);
});
Demo
Логика внутри слушателя становится немного сложнее, но вся логика содержится в одном один слушатель, так что это может сделать код кода менее сложным для более крупного проекта.
Можем ли мы увидеть вашу разметку html? – chockleyc