【问题标题】:Cycle through strings from an array, displaying one every second [duplicate]循环遍历数组中的字符串,每秒显示一个[重复]
【发布时间】:2018-11-08 22:40:05
【问题描述】:
$(function() {
    let testOne = 'test one.';
    let testTwo = 'test two';

    let messageBox = $('messagebox');

    let a = ['test:', testOne,'test2:', testTwo];
    let i = 1

    setInterval(cool, 1000)

    function cool() {
        messageBox.text(a[1])
    }
});

你好,

我是 JS 新手。我希望在我的屏幕上的计时器中显示testOnetestTwo(将添加更多)。我得到了帮助才能走到这一步。 例如,我试图让一个单词及其英文定义以时间循环出现在屏幕上,循环旋转单词。 (有点像实时屏幕保护程序)

我错过了什么?

感谢您的时间、帮助和努力。

【问题讨论】:

  • “在计时器中显示”是什么意思?
  • “我错过了什么?”Minimal, Complete, and Verifiable example 所需的其余代码。
  • 嗨 Z,例如,我正在尝试让一个单词及其英文定义以时间循环出现在屏幕上,循环旋转单词。 (有点像实时屏幕保护程序)
  • messagebox 将尝试查找类似<messagebox> 的元素,但这不是有效标签。如果要按类查找元素,则必须使用.messagebox,或者如果要按id 查找元素,则必须使用#messagebox。这一切都取决于你的html。 javascript 中的选择器和 CSS 选择器几乎是一对一的。如果您知道如何使用 CSS 选择器,您将对您的 javascript 选择器应该是什么有所了解。
  • 如果你愿意,你可以拥有<messagebox>。这是一个自定义的 html 元素。只要您注册并将其用作适当的 Web 组件。一切都好。 React 和 Angular 一直都在这样做,而且它仍然是 100% 有效的 HTML。 stackoverflow.com/questions/5682943/…

标签: javascript jquery loops set settimeout


【解决方案1】:

你有一个好的开始。

  1. 正如其他人所提到的,除非您使用自定义 HTML 元素(即 <messagebox>),否则请在选择器的开头使用 # 来指示“消息框”是​​一个 ID。见jQuery's ID Selector

    $('#messagebox')
    

    或者,使用一个类和class selector

    $('.messagebox')
    
  2. 要显示的数组元素的索引当前被硬编码为1。我们想在每次迭代时增加它,这样文本就会改变。但是我们只想数到数组元素的个数,然后回到第一个重新开始。

    下面,我使用 JavaScript 的 incrementremainder 运算符来增加 i,同时将其限制为 a 中的元素数量。请注意,“后缀”方法“返回递增前的值”,因此i 从零开始。

    a[i++ % a.length]
    

工作示例:

$(function() {

  let $messageBox = $('#messagebox');
  let testOne = 'test one.';
  let testTwo = 'test two.';
  let a = ['test:', testOne, 'test2:', testTwo];
  let i = 0;

  function cool() {
    $messageBox.text(a[i++ % a.length])
  }

  setInterval(cool, 1000);

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="messagebox"></div>

编辑

我不喜欢让i 无限期地计数。经过大约 9 万亿次循环迭代后,数学可能会变得很不稳定,这是 JavaScript 可以安全计算的高度。

在这种情况下,安全是指准确表示整数并正确比较它们的能力。例如,Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 将评估为 true,这在数学上是不正确的。 -- developer.mozilla.org

console.log(Number.MAX_SAFE_INTEGER);
console.log(Number.MAX_SAFE_INTEGER + 1);
console.log(Number.MAX_SAFE_INTEGER + 2);
console.log(Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2);

所以,这就是大约三百万个世纪之后发生的事情:

$(function() {

  let $messageBox = $('#messagebox');
  let testOne = 'test one.';
  let testTwo = 'test two.';
  let a = ['test:', testOne, 'test2:', testTwo];
  let i = 9007199254740990;

  function cool() {
    console.log(i);
    $messageBox.text(a[i++ % a.length])
  }

  setInterval(cool, 1000);

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="messagebox"></div>

这还不够好。
我们需要这个东西在the end of time之后运行良好。
让我们保持安全:

$(function() {

  let $messageBox = $('#messagebox');
  let testOne = 'test one.';
  let testTwo = 'test two.';
  let a = ['test:', testOne, 'test2:', testTwo];
  let i = 0;

  function cycleText() {
    console.log(i);
    $messageBox.text(a[i]);
    i = ++i % a.length;
    setTimeout(cycleText, 1000);
  }

  cycleText();

});
body {
  font-size: 2em;
  text-align: center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="messagebox"></div>

【讨论】:

  • 不需要使用id 选择器或class 选择器。如果 OP 想要一个名为 messagebox 的 html 元素,那很好,他们可以将其用作选择器。
  • @mwilson 同意。 OP 中的 HTML 结构不清楚,所以我提到了这两个选项。
  • 谢谢你,Showdev。我对之前必须进行的所有修复感到不知所措。我在展示我需要弄清楚的东西方面做得很差。我的问题一直延伸到忘记使用增量计数器。早些时候当我尝试它们时,我不会正确地完成语法,所以感谢您为我提供正确的方法。无论如何,谢谢。
  • $textBox.text(a[i++ % a.length]) - 因此,如果没有“% a.length])”,该函数将不会一遍又一遍地运行数组。我在哪里可以了解有关该代码用途的更多信息?更具体地说:我在哪里可以了解更多信息:“%”
  • 不使用%,值会变得越来越大,很快就会超过数组的大小。 (请注意,还有其他处理方法,例如,当达到a.length 时将i 设置回零。)有关参考,请参阅Remainder OperatorModulo Operation。另见What does % do in JavaScript?
【解决方案2】:

您可以轻松地换出数组中的消息并使用您的代码更新 html 元素。无需传入硬编码索引,只需递增一个数字,直到它达到数组的长度(n

我个人建议将您的 messagebox 元素设置为 div 或开箱即用的东西,只是为了便于阅读(所以没有人会混淆 messagebox 的来源)。但是,如果您有自定义 html 元素的特定用例,请确保您使用正确。

https://jsfiddle.net/mswilson4040/oxbn8t14/2/

<messagebox>Initial Value...</messagebox> // custom HTML element called messagebox


$(function() {
    let testOne = 'test one.';
    let testTwo = 'test two';
        let interval = -1;
    let messageBox = $('messagebox');

    let a = ['test:', testOne,'test2:', testTwo];
    // let i = 1 <-- this isn't doing anything

    setInterval(cool, 1000)

    function cool() {
            interval = interval < a.length ? interval += 1 : 0;
        messageBox.text(a[interval])
    }
});

【讨论】:

  • 计数器从 0 到 4。但是只有四个元素,所以它应该从 0-3 开始。也许interval &lt; a.length-1.
  • 感谢您的意见。我的沟通很差。下次我寻求支持时,我会更加适当和准备好。
  • 你很好!如果有帮助,请点赞或标记为答案!
  • 我会的!我需要完成一定数量的行动,直到我可以投赞成票。
  • HI, (a[i++ a.length]) ,这在代码中起到什么作用?
猜你喜欢
  • 2014-06-29
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 2022-01-16
  • 2019-09-07
相关资源
最近更新 更多