【问题标题】:Avoid execution goes on in a .each loop避免在 .each 循环中继续执行
【发布时间】:2010-12-01 01:12:14
【问题描述】:

我有一个类似这样的代码来查看某些单选按钮是否已被选中。当我发现一组具有相同名称值的单选按钮并且没有一个被检查时,我正在使用 jquery 的 .each 函数来显示警报。当我找到一个时,我想触发警报并返回 false,但在显示警报后,.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;

我怎样才能避免这种情况?

谢谢。

【问题讨论】:

  • 您是在另一个排序容器中的单选按钮组吗?以这种方式循环会更有效率,比如$(".container").each(... 然后检查$(this).find(":radio:checked").length,总体上检查的次数会少得多。
  • @Nick Craver 我知道它会更有效率,但我不希望这个功能依赖于单选按钮在 html 上的显示方式,因为它可能会在以后更改并且可能会有不止一个“广播组”在同一个容器中。
  • 只要它们在您可以识别的某种类型的容器中,即使您这样做了,也可以使其更加更有效率$(":radio").closest("div").each(...) 例如使其不可知。
  • @Nick Craver 好的,问题是现在在表格中,但以后可以在 div 中。我知道我可以使用 .closest("div") 或 .closest("table"),而且我知道以我正在做的方式去做是非常低效的。但我想避免任何人更改布局(某些 div 的表格)而忘记在此函数中更改它,但也许更高效值得冒险。
  • 不管怎样,只要把它放在那里。请注意,您的 JavaScript 很少能与 DOM 结构无关高效:)

标签: javascript jquery


【解决方案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;

【讨论】:

    【解决方案2】:

    您可以在更高的范围内使用相同的 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;
    

    上面的其他更改只是精简了代码,您可以使用更少的选择器引擎调用:)

    【讨论】:

      猜你喜欢
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2015-08-10
      • 2014-07-18
      • 2011-11-11
      • 1970-01-01
      相关资源
      最近更新 更多