【问题标题】:Loop Slowing Down Overtime and Eventually Crashing in Javascipt Running in HTML在 HTML 中运行的 Javascript 中循环减慢超时并最终崩溃
【发布时间】:2020-03-28 17:52:09
【问题描述】:

我对 Javascipt 和 HTML 非常陌生,我只想创建一个数字的更新显示。我目前正在使用 Weebly 托管网站/运行此代码,但我希望随着这些语言变得更好而改变这一点。我目前遇到的问题是,当我直接在我的计算机上运行代码时,它似乎运行良好,除了代码会随着时间的推移而变慢。当我在 Weebly 中运行它时,在我的计算机上它会将毫秒这个词强制为较小的字体,否则可以正常工作。在 Safari 中的 Iphone 上,我看到 this(我将颜色更改为红色的原因是因为我最终想将其设置为黑色,因为在 iPhone 上它显示为灰色,我不希望这样)最终红色文字消失,灰色文字没有更新。

这里是代码的相关部分

  var target = 1578135600000
  var rightnow = 1578135600000 - currdate.getTime()
  var rightnowstr = "(" + rightnow + " milliseconds)"
  var rightnowstr = rightnowstr.fontcolor("black")
  document.write(rightnowstr.fontsize(30))
  document.write("<br>")
  var substring = "until Columbia Invy"
  document.write(substring.fontsize(30))
  var rightnow2
  setInterval(function(){


    currdate = new Date()

    rightnow2 = String(1578135600000 - currdate.getTime())
    rightnow2 = rightnow2.fontcolor("red")
    document.body.innerHTML = document.body.innerHTML.replace(rightnow, rightnow2)
    rightnow = 1578135600000 - currdate.getTime()

   // document.body.innerHTML = document.body.innerHTML.replace(rightnow, rightnow = 1578135600000 - currdate.getTime())

   },1);

我也有一个代码版本,在电脑上完美运行,但在 Iphone 上,毫秒数是灰色的,不会更新。

  var target = 1578135600000
  var rightnow = 1578135600000 - currdate.getTime()
  var rightnowstr = "(" + rightnow + " milliseconds)"
  var rightnowstr = rightnowstr.fontcolor("black")
  document.write(rightnowstr.fontsize(30))
  document.write("<br>")
  var substring = "until Columbia Invy"
  document.write(substring.fontsize(30))
  var rightnow2
  setInterval(function(){


    currdate = new Date()

    document.body.innerHTML = document.body.innerHTML.replace(rightnow, rightnow = 1578135600000 - currdate.getTime())

  },1);

无论哪种方式,我只想要在 Iphone(在 Safari 上)和 Chrome 上显示黑色文本的东西,它会不断更新毫秒数。

【问题讨论】:

  • 每毫秒运行一个函数会很快消耗浏览器内存。重绘也很昂贵,每次更新 DOM 时都会发生。用更合理的时间尝试你的代码,比如 100 毫秒,然后调试它。然后缩短时间,直到您开始遇到问题。另请参阅:stackoverflow.com/questions/9647215/…
  • 快速更新 DOM 是违反直觉且成本高昂的。您是否尝试过将毫秒数更改为更高的值,例如 16 毫秒?这将为您提供 60FPS 更新,这是人眼可以感知的最高帧速率。您将获得 16 倍的价格 :)。
  • 我已经放慢了速度,实际上在我上传到 Weebly 的所有版本中,我都使用了诸如 337 毫秒之类的间隔(只是为了让最后一位数字不断变化)。我不认为减速错误主要是由这个更新率引起的,因为它只发生在某些版本的代码上,即使是 1ms
  • 看看这是否是 Weebly 特有的。尝试将您的 javascript 上传到 jsFiddle 或 Codepen 之类的地方,看看是否有同样的问题。
  • 如何制作一个常规的 ol' 样式元素而不是 fontcolor?来自 MDN:String.prototype.fontcolor() 已弃用此功能不再推荐。尽管某些浏览器可能仍然支持它,但它可能已经从相关的 Web 标准中删除,可能正在被删除,或者可能仅出于兼容性目的而保留。避免使用它,并尽可能更新现有代码;请参阅本页底部的兼容性表以指导您的决定。请注意,此功能可能随时停止工作。

标签: javascript html loops


【解决方案1】:

不要使用document.write 这很少是最佳实践。在您的页面上设置一些合理的 HTML,并且只更新需要它的元素。最后使用一个合理的数字进行刷新。

/* javascript to manipulate the DOM */
var target = 1578135600000
//Get the element that will hold the milliseconds
var countdownElement = document.getElementById("invCountdown");

  setInterval(function(){
    //Date Stuff
    currdate = new Date();    
    rightnow2 = String(target - currdate.getTime());
    //Set the style of the millisecond element
    countdownElement.style.color = "red";
    //Update the content of the millisecond element.
    countdownElement.innerHTML = rightnow2;   
   },16);
/*CSS to style the div with class inv*/
.inv {font-size:30px; color:#000;}
<!-- HTML -->
<!-- Generic block element to hold our content, with a class so we can style it -->
<div class="inv">
<!-- Generic inline element with an id so we can manipulate it easily with javascript -->
  (<span id="invCountdown">1578135600000</span>) milliseconds<br> until Columbia Invy 
</div>

【讨论】:

  • 从我在“运行代码 sn-p”中看到的内容来看,这似乎可以完美运行,但由于我对这一切都很陌生,我不知道如何使用或格式化.in 或
    并且不知道要搜索什么来查找这些信息。目前,我的整个文档如下所示:docs.google.com/document/d/… 我不知道该怎么做才能使 .inv 实际修改文本而不仅仅是显示
  • .inv 是一个 CSS 类,所以找一些 CSS 教程。 CSS 不是用来修改内容,而是用来设置样式。 Javascript用于修改内容。 CSS 是您应该使用的 HTML 文档样式。粗略地说,HTML 描述了一个文档。浏览器使用它来创建文档对象模型 (DOM)。浏览器使用 CSS 来设置 DOM 的样式,而浏览器使用 javascript 来操作 DOM
  • 非常感谢。我并不完全理解所有元素部分,但我能够弄清楚类和格式是如何工作的。我在 Weebly 中尝试过,似乎效果很好。
猜你喜欢
相关资源
最近更新 更多
热门标签