打破.each()

时间:2013-12-10 12:01:35

标签: javascript jquery

我想要突破.each()次迭代而且它不允许我这样做。这是我的代码。谢谢你的帮助!欣赏它。

$('#btn-submit-add').click(function(){
    var answerField = 1;
    $('.addAnswerChoice').each(function(){
        var answerChoice = $(this).val();
        if (answerChoice == ""){
            $('#answerChoice-'+answerField+'-Error').show();
            $(this).focus();
            return false; // this doesn't work
        }
        answerField++;
    });
    alert('doing stuff after');
});

3 个答案:

答案 0 :(得分:3)

我的猜测是你试图从点击处理程序返回false来取消提交。您拥有它的方式return false语句将从您传递给.each()的函数返回,该函数会突破.each()循环,但它不会从外部函数返回点击处理程序因此,执行继续执行.each()之后的语句,即最终警报。并且您的点击不会被取消。试试这个:

$('#btn-submit-add').click(function(e){
    var answerField = 1;
    $('.addAnswerChoice').each(function(){
        var answerChoice = $(this).val();
        if (answerChoice == ""){
            $('#answerChoice-'+answerField+'-Error').show();
            $(this).focus();
            e.preventDefault();
            return false;
        }
        answerField++;
    });
});

jQuery将event object传递给您的点击处理程序(注意我添加了一个名为e的参数),因此您可以使用event.preventDefault()来停止点击工作。

答案 1 :(得分:1)

此解决方案几乎与each类似,但在返回第一个true值时会短路。因此,您不必明确地突破迭代。

Array.prototype.slice.call(document.getElementsByClassName("addAnswerChoice")).some(function(item) {
 var answerChoice = item.value;
 if (answerChoice == ""){     
        $('#answerChoice-'+answerField+'-Error').show();
        item.focus();
        return true;
 }
 return false;
});

答案 2 :(得分:0)

来自documentation

  

我们可以通过使回调函数返回false来在特定迭代中中断$ .each()循环。返回非false与for循环中的continue语句相同;它将立即跳到下一次迭代。


编辑:

如果@nnnnnn是正确的,代码应如下所示:

$('#btn-submit-add').click(function(){
    var validated = true;
    var answerField = 1;
    $('.addAnswerChoice').each(function(){
        var answerChoice = $(this).val();
        if (answerChoice == ""){
            $('#answerChoice-'+answerField+'-Error').show();
            $(this).focus();
            validated = false;
            return false;
        }
        answerField++;
    });
    if (!validated)
    {
        return false;
    }
    alert('doing stuff after');
});