2010-11-30 2 views
0

У меня есть код, похожий на этот, чтобы проверить, были ли проверены некоторые радиокнопоны. Я использую функцию jaery для каждой функции jQuery, чтобы показать предупреждение, когда я нахожу группу переключателей с одинаковым именем, и ни один из них не был проверен. Когда я нахожу его, я хочу запустить предупреждение и вернуть false, но после того, как будет показано предупреждение, выполнение .each останавливается, но строки после функции .each выполняются (я имею в виду, что выполняется истинное значение).Избегайте выполнения в цикле .each

$(":radio").each(function(){ 
    var name = $(this).attr('name'); 
    var numAnswered = $(":radio").filter('[name='+name+']').filter(":checked").length; 
    var notAnswered = numAnswered == 0; 
    if(notAnswered){ 
     alert("Must answer all questions"); 
     return false; 
    } 
}); 
console.log('still goes here even when alert is fired'); 
return true; 

Как я могу избежать этой ситуации?

Спасибо.

+0

Вы переключаете группу в другом контейнере сортировки? Было бы гораздо эффективнее зацикливаться на этом пути, например '$ (". Container "). Each (...' then check '$ (this) .find (": radio: checked "). Length', –

+0

@Nick Craver Я знаю, что это было бы более эффективно, но я не хочу, чтобы эта функция полагалась на то, как радиокнопки отображаются на html, потому что это может быть изменено позже, и может быть быть больше, чем «радиогруппа» в том же контейнере. – Javi

+0

Пока они находятся в контейнере * some * sort, который вы можете идентифицировать, вы можете сделать его намного эффективнее, даже если вы сделали '$ (" : radio "). ближайший (" div "). each (...)', чтобы сделать его агностиком, например. –

ответ

1
var myreturnvalue = true; 
$(":radio").each(function(){ 
    var name = $(this).attr('name'); 
    var numAnswered = $(":radio").filter('[name='+name+']').filter(":checked").length; 
    var notAnswered = numAnswered == 0; 
    if(notAnswered){ 
     alert("Must answer all questions"); 
     myreturnvalue = false; 
     return false; 
    } 
}); 
console.log('still goes here even when alert is fired'); 
return myreturnvalue; 
1

Вы можете использовать тот же notAnswered переменную (или другой, независимо от плывет лодка) на более высоком объеме, как это:

var notAnswered; 
$(":radio").each(function(){ 
    notAnswered = $(":radio[name="+this.name+"]:checked").length == 0; 
    if(notAnswered){ 
     alert("Must answer all questions"); 
     return false; 
    } 
}); 
if(notAnswered) return false; 
console.log("will only fire if there's an answer"); 
return true; 

Другие изменения выше только похудение вниз код, вы можете уйти с гораздо меньшим числом вызывных сигналов двигателя:

Смежные вопросы