Отмена отправки формы в цикле jQuery .each()

В настоящее время у меня есть большой опрос, состоящий из одной формы, 5 категорий, набора вопросов в каждой категории и нескольких ответов с переключателями для каждого вопроса. Каждая категория находится в другом наборе полей, и для каждой категории требуется разное минимальное количество голосов для обработки формы.

По сути, при отправке формы я пытаюсь заставить jQuery пройти через каждый набор полей с помощью цикла .each() и решить, было ли выполнено минимальное количество голосов в каждой категории, а если нет, отменить отправку формы. То, что у меня есть до сих пор, прекрасно обрабатывает категории, но не мешает отправке формы при необходимости.

$('#pollform').submit(function(event){

    var formsubmit = event;

    $('fieldset').each(function(formsubmit){
        catname     = $(this).children('input[name=catname]').val();    // Category name
        reqvotes    = $(this).children('input[name=catcount]').val();   // Minimum required number of votes for current category in loop
        numvotes    = $(this).children(':checked').size();              // Number of votes for current category in loop 

        // Check minimum number of votes against actual number cast.  Alert user and prevent form from submitting if necessary
        if (reqvotes > numvotes)
        {
            alert('You need to fill out at least '  + reqvotes + ' items for ' + catname  + '.');

            formsubmit.preventDefault();
        }
    });

});

Любые идеи?


person John    schedule 16.02.2011    source источник


Ответы (2)


Вы пытались просто вернуть false? Конечно, вы должны сделать это снаружи каждого цикла.

$('#pollform').submit(function(event){

    var stopsubmit = false;

    $('fieldset').each(function(formsubmit){
        if(stopsubmit) return;
        catname     = $(this).children('input[name=catname]').val();    // Category name
        reqvotes    = $(this).children('input[name=catcount]').val();   // Minimum required number of votes for current category in loop
        numvotes    = $(this).children(':checked').size();              // Number of votes for current category in loop 

        // Check minimum number of votes against actual number cast.  Alert user and prevent form from submitting if necessary
        if (reqvotes > numvotes)
        {
            alert('You need to fill out at least '  + reqvotes + ' items for ' + catname  + '.');

            stopsubmit=true;
        }
    });
    if(stopsubmit) return false;
});

Я не тестировал этот код.

person Marco    schedule 16.02.2011

Добавьте return false; сразу после предпоследнего });, вам нужно будет возвращать false только один раз, а не каждый раз при циклическом выполнении этой функции each().

person Anriëtte Myburgh    schedule 16.02.2011
comment
Добавление return false; после предпоследнего }); просто предотвращает отправку формы вообще, независимо от того, было ли подано минимальное количество голосов или нет. - person John; 16.02.2011