Jquery — переключатель

#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 оператора ничего не делают.