Jquery, в то время как каждый: как проверить, если все: выбрано не 0 - PullRequest
2 голосов
/ 15 мая 2011

У меня есть форма с несколькими выпадающими списками, и я хочу убедиться, что по крайней мере у одного значение по умолчанию '0' изменилось на что-то другое.Тем не менее, я не могу придумать, как это сделать.Я пробовал оба .each () и оператор while, и ни один из них не ведет себя так, как я ожидал.

Вот HTML-код:

<form>
        <label>Qty:</label>
        <select class="Qty">
            <option selected="selected">0</option>
            <option>1</option>

       </select>
       <br />
       <label>Qty:</label>
        <select class="Qty">
            <option selected="selected">0</option>
            <option>1</option>
       </select>
       <br />
       <br />
       <label>Qty:</label>
        <select class="Qty">
            <option selected="selected">0</option>
            <option>1</option>
       </select>
       <br />
       <a href="#">test</a>
</form>

, а вот оператор while:

 $(document).ready(function(){
    $('a').click(function(e){
        e.preventDefault();
        while ($('select > option:selected').val()==0){
                alert('hello');

            } 
    });

Если все селекторы не установлены на что-то отличное от 0, он застревает в цикле, где он продолжает тестировать селекторы (таким образом, появляется приветственное предупреждение).

Iпопробовал также и все.

$('a').click(function(e){
        e.preventDefault();
        $('select > option:selected').each(function (i) {
            if($(this).val()>0) {
                alert('okay to proceed');
            } else {
                alert('nothing found');
            }
        });
    });

Это немного лучше, но он продолжает проверять даже после того, как нашел верный ответ.Поэтому, если я попытаюсь вызвать сообщение об ошибке, он скажет, что все в порядке, но затем все равно вызовет сообщение об ошибке.Я также попытался установить переменную для, если она действительна или нет, но она продолжает отображаться как ложная:

$('a').click(function(e){
        e.preventDefault();
        var valid = false;
        $('select > option:selected').each(function (i) {
            if($(this).val()>0) {
                var valid= true;
                alert(valid);
            }
        });
        if(valid==true) {
            alert(valid);
            alert('it works');
        } else {
            alert(valid);
            alert('uh-oh');
        }
    });

Я явно что-то упускаю.Любая помощь по этому вопросу будет принята с благодарностью.

Ответы [ 3 ]

3 голосов
/ 15 мая 2011

В вашей первой попытке оператор while будет продолжать цикл, потому что:

$('select > option:selected').val() всегда будет ==0 и никогда не покинет цикл.

Для .each вы можете разорвать цикл, если он найден по return false, как указано в документации .

В последнем случае вы объявляете var внутри .each(function(), что означает, что оно определено только внутри этой функции, и как только оно перейдет к следующему each в выборе, var будет переопределено - как только он вышел из .each, он больше не объявляется.

Итак, отработав ваш последний пример: jsfiddle

 $('a').click(function(e){
        e.preventDefault();
     var found = false;
     $('select').each(function(){
         if($(this).val()!=0){
             found = true;
             return false;
         }
     });
     if(found)
     {
         alert('success');
     }
     else
     {
         alert('failed');
     }
 });
2 голосов
/ 15 мая 2011

Просто работаю над исправлением финальной итерации вашего кода.Причина, по которой valid всегда отображается как false, заключается в том, что вы определяете новую переменную с именем valid, которая является локальной для замыкания, предоставленного каждому методу.Это скрывает внешнюю переменную, которая остается неизменной.

Обновите ваш код до

$('a').click(function(e){
    e.preventDefault();
    var valid = false;
    $('select > option:selected').each(function (i) {
        if($(this).val()>0) {
            valid= true;
            alert(valid);
        }
    });
    if(valid) {
        alert(valid);
        alert('it works');
    } else {
        alert(valid);
        alert('uh-oh');
    }
});

и все должно работать (я удалил ключевое слово var из каждого замыкания). Вот еще немного документации по области видимости в JS, которая может помочь.

Как только вы нашли первую ненулевую выбранную опцию, вы можете остановить продолжение каждого цикла, возвращая false, то есть

$('a').click(function(e){
    e.preventDefault();
    var valid = false;
    $('select > option:selected').each(function (i) {
        if($(this).val()>0) {
            valid= true;
            alert(valid);
            return false;
        }
    });
    if(valid) {
        alert(valid);
        alert('it works');
    } else {
        alert(valid);
        alert('uh-oh');
    }
});
1 голос
/ 15 мая 2011

Я не уверен, правильно ли я понимаю ваш вопрос, но для получения значения выберите использование $('select').val(), кроме попыток получить значения val()

и установки значений для параметров, которые вы должныустановить <option value="0">0</option>

так

$('select').each(function(){
   if($(this).val()==0){
      dostuff
   }
})
...