【问题标题】:JavaScript / jQuery: possible to 'automate' switch statement through for loop?JavaScript / jQuery:可以通过 for 循环“自动化”切换语句吗?
【发布时间】:2012-07-07 16:01:12
【问题描述】:

解决方案

$(window).scroll(function() {
            var y = $(this).scrollTop();
            for (var i = 0; i < offset.length; i++)
                {
                    if (y < offset[i].bottom) {
                        $("#catSelect option:selected").removeAttr("selected");
                        $("#catSelect option[value=#"+offset[i].id+"]").attr("selected", "selected");
                        break;
                    }
                }
        });

感谢你们的帮助!

问题

我是 JavaScript 和 jQuery 的初学者,所以我希望有好心人可以帮助我。 下面是一个执行得很好的代码的 sn-p ......但由于它非常重复,我试图想出一些代码来帮助我在 switch 语句中“自动化”所有这些条件,而不是手动指定它(如果这有意义的话)。我将使用“for”循环,但目前还没有结果。

请向正确的方向轻推,好吗?谢谢你:)

~初步代码~

var offset = [];
        $(".cat").each(function() {
            var top =  $(this).offset().top;
            var bottom = top + $(this).outerHeight();
            var id = $(this).attr("id");
            offset.push({"top": top, "bottom": bottom, "id": id });
            $(document.body).append(offset.length);
        });

~就是代码~

$(window).scroll(function() {
    var y = $(this).scrollTop();

        switch (true) {
            case (y < offset[0].bottom):
                $("#catSelect option:selected").removeAttr("selected");
                $("#catSelect option[value=#"+offset[0].id+"]").attr("selected", "selected");
                break;
            case (y < offset[1].bottom):
                $("#catSelect option:selected").removeAttr("selected");
                $("#catSelect option[value=#"+offset[1].id+"]").attr("selected", "selected");
                break;
            case (y < offset[2].bottom):
                $("#catSelect option:selected").removeAttr("selected");
                $("#catSelect option[value=#"+offset[2].id+"]").attr("selected", "selected");
                break;
            }

        });

【问题讨论】:

  • 这是错误的:i &gt; offset.length 应该是i &lt; offset.length,所以它的计算结果是0 &lt; 3,1 &lt; 3,2 &lt; 3,停止。您的循环永远不会运行,因为第一个评估是 0 &gt; 3,这是错误的。

标签: javascript jquery loops scroll switch-statement


【解决方案1】:

你的方法很出色!我从来没有考虑过switch(true) :)

你可以试试这个,看看它是否适合你:

for (var i = 0; i<=2; i++)
{
    if (y < offset[i].bottom) {
        $("#catSelect option:selected").removeAttr("selected");
        $("#catSelect option[value=#"+offset[i].id+"]").attr("selected", "selected");
    }
}

【讨论】:

  • 为什么使用名称i 而不是index? i 是有史以来最糟糕的变量名,看起来很像 1、l 和 i。
【解决方案2】:

因为只有数组索引在不同情况下不同:

for (var i = 0; i < offset.length; i++) {
  if (y < offset[i].bottom) {
    $("#catSelect option:selected").removeAttr("selected");
    $("#catSelect option[value=#"+offset[i].id+"]").attr("selected", "selected");
    break;
  }

【讨论】:

  • 为什么使用名称i 而不是index? i 是有史以来最糟糕的变量名,看起来很像 1、l 和 i。
  • 我只是好奇:OP 的回答是否会导致跳转到第一个评估为 true 的语句?我想 javascript 的内部工作原理会导致每一个都被检查,直到找到一个真正的
  • 感谢您的快速回复!我之前已经尝试过(尽管我认为您的意思是“i > offset.length”)。它不起作用!嗯。
  • @AKG - 这是i &lt; offset.length。否则,它永远不会运行,例如,第一个循环将评估 0 &gt; 3。
  • @Hogan:变量名i 是迄今为止最常用于循环计数器的变量名,紧随其后的是j 和k。这是来自 Fortran 的一个古老传统,其中这些变量由于它们的名称而自动成为整数。即使变量名本身不是很好,但它是一种在程序员中被广泛认可的模式,所以如果你想要一个简短的循环计数器变量名,它是最好的选择。
猜你喜欢
  • 2011-01-14
  • 2016-06-19
  • 1970-01-01
  • 2021-11-05
  • 2022-01-24
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
相关资源
最近更新 更多