Если я внутри
$("#srochnost").on("change", function() { напишу alert(srochnost);то он сработает. А вот IF отработает, только если я снова задам переменные... Те же, что уже заданы. |
конкретно сейчас решается следующая задача.
Есть внешняя функция, в которой объявлены переменные (чекбоксы и селекты) Есть внутренняя функция, которая говорит следующее Если в первом селекте выбрана опция №2, то во втором селекте может быть только опция №3 доступна. |
$(function() { var srochnost = $('select[name=srochnost]').val(); // 1 - срочный, 2 - с проживанием var rejim = $('select[name=rejim]').val(); // 1 - дневной, 2 - ночной, 3 - суточный $("#srochnost").on("change", function() { if ( srochnost == 2 ) { $('#rejim-opt-null').fadeOut(); $('#rejim-opt-day').fadeOut(); $('#rejim-opt-night').fadeOut(); $("#rejim [value='3']").prop("selected", "3"); } else { $('#rejim-opt-null').fadeIn(); $('#rejim-opt-day').fadeIn(); $('#rejim-opt-night').fadeIn(); $("#rejim [value='0']").prop("selected", "0"); } }); }); |
Может проще:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script> $(function() { $('#srochnost').on('change', function() { if(!this.value) return; $('#rejim option').slice(0, -1) .prop('disabled', this.value==2) .end() .eq(3) .prop('selected', this.value==2) }) }); </script> <select class="form-control" name="srochnost" id="srochnost"> <option value="" disabled>Выбрать...</option> <option value="1">Срочный</option> <option value="2">С проживанием</option> </select> <select class="form-control" name="rejim" id="rejim"> <option id="rejim-opt-null" value="">Выбрать...</option> <option id="rejim-opt-day" value="1">Дневной</option> <option id="rejim-opt-night"value="2">Ночной</option> <option id="rejim-opt-sutki" value="3">Суточный</option> </select> |
Визуально - работает.
Но при попытке алертом выдать значения двух этих селектов - выдает 0 и 0 при любом раскладе. $(function() { var srochnost = $('select[name=srochnost]').val(); var rejim = $('select[name=rejim]').val(); $('#srochnost').on('change', function() { if(!this.value) return; $('#rejim option').slice(0, -1) .prop('disabled', this.value==2) .end() .eq(3) .prop('selected', this.value==2) alert(srochnost + " " + rejim) }); }); |
Каким алертом, чего и зачем?
PS. Зачем вообще это нужно? var srochnost = $('select[name=srochnost]').val(); var rejim = $('select[name=rejim]').val(); И почему тогда не var srochnost = $('#srochnost').val(); var rejim = $('#rejim').val(); ? А "при любом раскладе" потому, что эти значения были получены до изменения состояния списков, и их никто не изменял. |
что-то я не догоняю.
Есть селект. При выборе опции ему присваивается значение определенное. Мне нужно с этими селектами работать дальше. Нужны их значения. Я объявляю переменную и получаю значение нужного селекта. И это всегда работает без проблем. 20 селектов - я спокойно получаю 20 значений и делаю с ними дальше то что мне нужно. А как только появляется эта функция, которая отвечает за скрытие и открытие не нужных опций - то я уже не получаю их значения... точнее получаю нули в обоих списках. Как с ними дальше то работать. Объявлена переменная var srochnost = $('select[name=srochnost]').val(); потом проходят манипуляции со списками. и я получаю всегда значение var srochnost = 0. Алерт я объявляю после того как прошли все изменения, а все равно ноль выводит. |
val надо получать каждый раз внутри функции с обработчиком change, а не один раз при загрузке
|
Спасибо!
с переменными разобрался. все сводится к тому чтобы их по новой прописывать внутри каждой функции. |
the_little,
j0hnik, уже написал, но учтите, что изменение состояние списка не обязательно произойдет, поэтому в вашей задаче, может лучше опрашивать сами списки, получая их значения? PS. И запомните и .prop("selected", "3"), и .prop("selected", "0") выберет указанную опцию, ибо и "3", и "0" вернет true, так как это строковое значение и не пустое. |
Часовой пояс GMT +3, время: 04:07. |