【问题标题】:Updating prime number via javascript doesn't work通过javascript更新素数不起作用
【发布时间】:2013-12-09 14:33:04
【问题描述】:

我尝试在不使用服务器端编码的情况下使用 javascript 即时更新素数。 这是我的代码。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>AJAX with PHP: Quickstart</title>
<script type="text/javascript">
var n = 1;
search: while (true) {
  n += 1;
  for (var i = 2; i <= Math.sqrt(n); i += 1)
    if (n % i == 0)
     continue search;
  // found a prime!
    document.getElementById('result').innerHTML=n;
}
</script>
</head>
<body>
    <p> I want to update prime number here</p>

<div id="result" >

</div>   
</body>
</html>

但是,这里没有更新 div "result"。我们不能只用javascript来做到这一点吗? 像下面的例子一样http://www.whatwg.org/demos/workers/primes/page.html

更新代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>AJAX with PHP: Quickstart</title>
<script type="text/javascript">
var n = 1;
function testNextPrime() {
    var isPrime = true;
    n = n + 1;
   // console.log('testing', n);
    for (var i = 2; i <= Math.sqrt(n); i += 1) {
        if (n % i == 0) isPrime = false;
    }

    if (isPrime) {
       document.getElementById('result').innerHTML=n;
      }

    // Schedule the next test (this gives browser a chance to update display and process any other events)
    setTimeout(testNextPrime, 2000);
}
// Start testing for primes
testNextPrime();
</script>
</head>
<body>
    <p> I want to update prime number here</p>

<div id="result" >

</div>   
</body>
</html>

【问题讨论】:

  • 哇,在 JS 中使用标签???在编写 JS 的 15 年中,我还没有看到任何使用标签的真实代码。我什至不确定它们应该如何与 while 这样的循环一起工作。
  • 这样做的真正目的是什么?它似乎是一个无限循环!例如,将“while(true)”更改为“while(n

标签: javascript primes


【解决方案1】:

问题是你有一个无限循环。你永远不会退出while (true) ... 循环?在此之前,浏览器永远没有机会更新 DOM 并刷新显示。

这是一个JSFiddle showing one way to use setTimeout(),用于放弃对主事件循环的控制。

更新:您可以使用网络工作者,但这需要将工作者代码分解为可以从单独的 URL 加载的脚本。 Doing this in a JSFiddle 是可能的,但需要一些扭曲,使解决方案比其他必要的复杂一些。因此,在阅读该代码时请注意这一点。

【讨论】:

  • 我们不能像这样演示吗?这里使用了webworkers技术whatwg.org/demos/workers/primes/page.html
  • 呃,不,因为那个演示页面似乎有同样的问题。 (锁定该浏览器选项卡,我预计,由于存在无限循环。)
  • 也就是说,是的,这个问题对于网络工作者来说是一个很好的用例,但你肯定需要实现这样你才能避免无限循环问题。
  • 查看上面的第二个 jsfiddle 链接,例如使用网络工作者(不是我的代码,顺便说一句,我只是在谷歌搜索时偶然发现它)
  • 我将我的代码更新为你的,但我想更新 ` if (isPrime) { document.getElementById('result').innerHTML=n; 中的素数}` 但它不会在结果 div 中打印素数,尽管它会打印 jsfiddle。
【解决方案2】:

尝试替换这一行:

// found a prime!
    document.write(n);

请记住,您的循环是无限的,浏览器很可能会在某个时候崩溃。

【讨论】:

    猜你喜欢
    • 2017-02-16
    • 2011-04-27
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2014-05-23
    相关资源
    最近更新 更多