【问题标题】:Javascript while loop makes the page not loadJavascript while循环使页面无法加载
【发布时间】:2011-10-22 14:40:56
【问题描述】:

当我把它放在我的标题中时:

<script>
function checkiffinished() {
  var n = $('.result-row').length;
  while (n!==3)
  {
  n = $('.result-row').length;
  $("span").text("There are " + n + " divs.");
  };

  };
</script>

然后在体内放

<script>
 checkiffinished();
 </script>

然后页面崩溃。

该代码应该计算具有“结果行”类的 div 的数量并重复此操作,直到具有上述类的 div 的数量为 3。

我怎样才能做到这样而不会使页面崩溃?

编辑 1:我在页面中的其他 jQuery 导致另一个事件中有 .result-row 元素,这就是我需要它定期检查的原因。

EDIT2:我正在尝试与其他一些操纵页面上元素的 jQuery 并行运行它。

【问题讨论】:

  • n 永远不会增加,有没有添加任何 .result-row 元素?
  • “崩溃页面”是什么意思?浏览器是否冻结?为什么在循环中重新分配 n 具有相同的值?
  • 我在页面中的其他 jquery 导致另一个事件中有 .result-row 元素,这就是为什么我需要它定期检查。
  • while 循环将阻止任何其他代码执行。
  • 您没有延迟 while 循环的迭代。看在上帝的份上,给浏览器一些喘息的空间:)(使用计时器或其他东西)

标签: javascript jquery html loops while-loop


【解决方案1】:

JavaScript 一次只能运行一段代码。所以你的while 循环阻塞了所有的 JavaScript 执行。因此,任何添加元素的代码都会被暂停 - 基本上是永远暂停。

相反,您可能希望使用检查间隔,例如每秒:http://jsfiddle.net/pimvdb/sbs6m/1/

function checkiffinished() {
  var n = $('.result-row').length;
  $("span").text("There are " + n + " divs.");
  if(n === 3) {
    // do something
    clearInterval(interval);
  }
};

var interval = setInterval(checkiffinished, 1000); // 1000 ms = 1 second

【讨论】:

  • 这会起作用,但如果他的功能错误,它仍然会冻结页面。
  • @Will Evans:他的while 循环冻结了页面。此代码没有任何无限循环。
  • 页面加载但随后冻结(冻结是指其他 jquery 元素都不起作用)
  • @Josh:小提琴也会冻结吗?
  • @Josh:也许你的 jQuery 不正确。如果实际上没有冻结,请不要使用冻结一词。
【解决方案2】:

你的问题是 n 没有递减。

pimvdb 的想法不错。这是一个包含回调的实现:

 var waitUntil = function (fn, condition, interval) {
    interval = interval || 100;

    var shell = function () {
            var timer = setInterval(
                function () {
                    var check;

                    try { check = !!(condition()); } catch (e) { check = false; }

                    if (check) {
                        clearInterval(timer);
                        delete timer;
                        fn();
                    }
                },
                interval
            );
        };

    return shell;
};

像这样使用它:

waitUntil(
  function () {
    // the code you want to run here...
  },
  function() {
    // the code that tests here... (return true if test passes; false otherwise)
  },
  0 // amout to wait between checks
)();

【讨论】:

  • 这对这里有什么帮助?能给我举个例子吗? All 是什么?
  • 嗯。你的代码应该遍历一个数组并对每个元素做一些事情。我不明白如何将其应用于定期检查存在多少特定类型的元素。
【解决方案3】:

如果n !== 3,您的代码是一个无限循环,因为您在 while 循环中所做的任何事情都不会改变 n 的值,因此 while 循环只会永远运行,等待 n 的值变为 3。目前尚不清楚为什么你把它放在while 循环中。在我看来,它应该只是 if 而不是 while

<script>
function checkiffinished() {
  var n = $('.result-row').length;
  if (n!==3)
  {
    $("span").text("There are " + n + " divs.");
  };

}
</script>

如果你要使用 while 循环,那么你必须有一些东西可以真正改变循环中 n 的值,并且代码可以确保你在 while 循环中达到条件以防止无限循环。

正如其他人所说,如果您想定期检查 3 的值,那么您需要使用 setTimeout 或 setInterval 重复执行此函数,而不仅仅是无限循环。但是,您不想经常执行它,否则您可能会降低您的网站和浏览器中其他页面的性能。

实现这一点的最佳执行方式是在您修改页面时手动调用checkiffinished()。这样,当没有任何更改时,不会浪费浏览器周期定期检查页面值,并且页面将在更改后立即更新(无需等待下一个计时器触发来检查页面)。

【讨论】:

    【解决方案4】:

    Urmm,尝试制作一个按钮,看看它是否会调用它并且不会崩溃,例如&lt;input type="button" value="Click me!" onclick="checkiffinished()" /&gt;

    【讨论】:

    • 当我点击按钮时它会冻结页面。
    • 哦,试试使用间隔。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多