#jquery #switch-statement
#jquery #оператор переключения
Вопрос:
Я пытаюсь управлять скрытым входным значением на основе значения 2 предыдущих полей. Я добился некоторого успеха с инструкцией switch, но, похоже, я просто не могу заставить ее работать точно. Чего бы я хотел, так это проверить, ввел ли пользователь CA или NV в поле #state, если он это сделал И выбрал значение параметра auto, значение #ins_link изменится на CA или NV (соответственно). Что я здесь делаю не так? Вот с чем я работаю:
<input class="statefield isstate" name="state" id="state" maxlength="2" onkeyup="this.value=this.value.toUpperCase();">
<select class="input_field_12em required" name="ins_type" id="ins_type">
<option value="" selected="selected" >---Select Insurance Type---</option>
<option value="home">Home</option>
<option value="auto">Auto</option>
<option value="homeauto">Home Auto</option>
<option value="renter">Renter</option>
<option value="buildingowner">Building Owner</option>
<option value="dwellingfire">Dwelling Fire</option>
<option value="commercial">Commercial</option>
<option value="agricultural">Agricultural</option>
</select>
$(function() {
$('#ins_type').change(function() {
switch (this.value) {
case 'auto':
if ($("#state[CA]" amp;amp; "#ins_type[auto]"))
$(".ins_link").val("CA");
break;
case 'auto':
if ($("#state[NV]" amp;amp; "#ins_type[auto]"))
$(".ins_link").val("NV");
default :
$(".ins_link").val("summary");
break;
}
});
});
<input type="hidden" class="link ins_link" value="summary">
Ответ №1:
Фактический способ решить вашу проблему был бы
$(function () {
$('#ins_type').change(function() {
if (this.value === "auto") {
var state = $("#state").val();
if (state === "CA" || state === "NV") {
$(".ins_link").val(state);
} else {
$(".ins_link").val("summary");
}
}
});
});
Вы видите, как этот код на самом деле отражает ваши требования?
- Если
#ins_type
значение равно «auto»:- Если
#state
значение равно «CA» или «NV», установите.ins_link
значение в выбранное состояние. - В противном случае установите для
.ins_link
значения значение «summary».
- Если
Структура вашего кода должна отражать структуру вашего мышления.
Комментарии:
1. Спасибо! Это помогает мне понять. К сожалению, теперь, когда я выбираю опцию, отличную от auto , ссылка .ins_link не изменяется обратно на «summary», хотя я вижу, что вы вставили ее в код. Есть идеи, почему?
2.Ну что ж, следуйте логической цепочке. В каких случаях
.ins_link
устанавливается значение"summary"
? Только когда#ins_type
значение равно"auto"
иstate
не"CA"
и не"NV"
. Чтобы получить желаемый эффект, вам понадобится другойelse
для обработки случая, когда значение не"auto"
равно.
Ответ №2:
if ($("#state[CA]" amp;amp; "#ins_type[auto]"))
Это выполнение логического И из двух строк, результат которого затем используется в качестве селектора для элемента на вашей странице. Это не сработает.
В вашем примере кода не показано, где / как вы храните информацию о состоянии, но вы хотели бы что-то более похожее на это:
case 'auto':
if ($('#state').val() == 'CA') {
... do california stuff ...
}
if ($('#state').val() == 'NV') {
... do nevada stuff ...
}
break;
Повторная проверка выбора ‘auto’ во внутреннем if() является избыточной, поскольку вы уже принудительно установили его в ‘auto’ с помощью switch()
.
Комментарии:
1. Чего он, вероятно, хочет, так это
$("#state[CA],#ins_type[auto]").length
2. @Kevin Peno: нет, это не сработает, потому что у
#state
элемента никогда не будет имени атрибутаCA
, поэтому селектор атрибута[CA]
никогда не будет совпадать.3. @Domenic, никогда не будет или не должен ?
4. @Kevin Peno: никогда не будет. Я не вижу
<input id="state" CA="something" />
в его коде.5.
#state[value='CA']
будет работать, если предположить, что это поле ввода, а не выпадающий список.
Ответ №3:
У вас есть некоторые недопонимания того, как здесь работают JavaScript и jQuery.
"#state[CA]"
это просто строка, как "#ins_type[auto]"
"#state[CA]" amp;amp; "#ins_type[auto]"
преобразует эти строки в bools, затем спрашивает, являются ли они оба true. Только пустая строка преобразуется в false, поэтому логика:
"#state[CA]" amp;amp; "#ins_type[auto]" === true amp;amp; true === true
Затем вы завершаете это с помощью $
вызова функции, которая просто преобразует свои аргументы в объект jQuery. Итак
$("#state[CA]" amp;amp; "#ins_type[auto]") === $(true) = $()
т.е. вы просто получили пустой объект jQuery, поскольку вы не передали селектор или элемент DOM.
Если вы протестируете любой не- null
, не- undefined
объект с помощью if
, он преобразует его в bool, так что вы получаете if(true)
:
if ($("#state[CA]" amp;amp; "#ins_type[auto]"))
<=> if ($())
<=> if (true)
Та же логика применима ко второму if
оператору, поэтому оба if
оператора ничего не делают.