Jquery - переключатель && не работает? - PullRequest
0 голосов
/ 21 апреля 2011

Я пытаюсь контролировать скрытое значение ввода на основе значения 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]" && "#ins_type[auto]"))
              $(".ins_link").val("CA"); 
              break;
            case 'auto':
           if ($("#state[NV]" && "#ins_type[auto]"))
              $(".ins_link").val("NV"); 
           default :
              $(".ins_link").val("summary");
           break; 
        }
    });
});

<input type="hidden" class="link ins_link" value="summary">

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

Фактический способ решения вашей проблемы будет

$(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 голос
/ 21 апреля 2011
       if ($("#state[CA]" && "#ins_type[auto]"))

Это логическое И двух строк, результат которых затем используется в качестве селектора для элемента на вашей странице.Это не будет работать.

В вашем примере кода не указано, где и как вы храните информацию о состоянии, но вам нужно что-то похожее на это:

case 'auto':
    if ($('#state').val() == 'CA') {
        ... do california stuff ...
    }
    if ($('#state').val() == 'NV') {
        ... do nevada stuff ...
    }
    break;

Проверка на 'auto 'selection снова во внутреннем if () является избыточным, так как вы уже заставили его быть' auto 'с помощью switch().

0 голосов
/ 21 апреля 2011

У вас есть некоторые недоразумения о том, как здесь работают JavaScript и jQuery.

"#state[CA]" - это просто строка, так как "#ins_type[auto]"

"#state[CA]" && "#ins_type[auto]" преобразует эти строки в bools, затемспрашивает, правда ли они оба.Только пустая строка преобразуется в ложь, поэтому логика:

"#state[CA]" && "#ins_type[auto]" === true && true === true

Затем вы оборачиваете это вызовом функции $, который просто преобразует свои аргументы в объект jQuery.Так что

$("#state[CA]" && "#ins_type[auto]") === $(true) = $()

т.е. вы только что получили пустой объект jQuery, поскольку вы не передали селектор или элемент DOM.

Если вы тестируете любой не null, неundefined объект с if, он преобразует его в bool, так что вы получите if(true):

    if ($("#state[CA]" && "#ins_type[auto]"))
<=> if ($())
<=> if (true)

Та же логика применима ко второму оператору if, поэтому оба оператора if делаютнет ничего.

...