在将元素推送到 HTML ID 时更新实时 JavaScript 数组

Posted

技术标签:

【中文标题】在将元素推送到 HTML ID 时更新实时 JavaScript 数组【英文标题】:Update live JavaScript Array while pushing elements to HTML ID 【发布时间】:2017-12-14 02:59:10 【问题描述】:

作为一个 javascript 新手,我面临着一个小小的困境。让我解释一下脚本:

    我实现了一个 JavaScript 函数 rss(),它从 Internet RSS 新闻提要中提取新闻标题并将新闻标题保存到数组 newsArray[]。 函数headlinesInsert() 应该将数组中的每一项推送到html ID #headlineInsert,类似于here 的显示方式。 但是,链接示例的 textlist 变量(应替换为我的本地 newsArray[])由于某种原因似乎不“兼容”,因为在 HTML 端没有显示任何内容。

想法rss() 函数每 10 分钟用新标题更新全局 newsArray[],而 headlinesInsert() 不断将此数据推送到 HTML ID(根据链接的示例)。

由于我对 JavaScript 的了解有限,我希望有人可以帮助我正确设置以下代码并将想法付诸实践。

// Push RSS Headlines into HTML ID
var newsArray = [];
var listTicker = function headlinesInsert(options) 
    var defaults = 
        list: [],
        startIndex:0,
        interval: 8 * 1000,
    

    var options = $.extend(defaults, options);
    var listTickerInner = function headlinesInsert(index) 
        if (options.list.length == 0) return;
        if (!index || index < 0 || index > options.list.length) index = 0;
        var value = options.list[index];
        options.trickerPanel.fadeOut(function headlinesInsert() 
            $(this).html(value).fadeIn();
        );
        var nextIndex = (index + 1) % options.list.length;

        setTimeout(function headlinesInsert() 
            listTickerInner(nextIndex);
        , options.interval);
    ;
    listTickerInner(options.startIndex);


// The following line should hold the values of newsArray[]
var textlist = new Array("News Headline 1", "News Headline 2", "News Headline 3", "News Headline 4");

$(function headlinesInsert() 
    listTicker(
        list: textlist ,
        startIndex:0,
        trickerPanel: $('#headlineInsert'),
        interval: 8 * 1000,
    );
);

$(function slow()
    // Parse News Headlines into array
    function rss() 
        $.getJSON("https://api.rss2json.com/v1/api.json?rss_url=https%3A%2F%2Fwww.stuff.co.nz%2Frss", function(data) 
            newsArray = [];
            for (var i = 0; i < data.items.length; i++)
                newsArray[i] = (data.items[i].title);
            
            console.log(newsArray);
    )

    // Refresh functions ever 10 minutes
    rss()
    setInterval(function slow() 
        rss();
    , 600000); // 10 Minute refresh time
);

【问题讨论】:

也许这个 (***.com/questions/19562494/…) 可以帮助你。 【参考方案1】:

检查以下代码。加载 rss 提要后,您需要初始化 listTicker

<script src='https://code.jquery.com/jquery-3.2.1.min.js'></script>
<script>
  var listTicker = function(options) 

    var defaults = 
      list: [],
      startIndex: 0,
      interval: 3 * 1000,
    
    var options = $.extend(defaults, options);

    var listTickerInner = function(index) 

      if (options.list.length == 0) return;

      if (!index || index < 0 || index > options.list.length) index = 0;

      var value = options.list[index];

      options.trickerPanel.fadeOut(function() 
        $(this).html(value).fadeIn();
      );

      var nextIndex = (index + 1) % options.list.length;

      setTimeout(function() 
        listTickerInner(nextIndex);
      , options.interval);

    ;

    listTickerInner(options.startIndex);
  

  var textlist = new Array("news1", "news2", "news3");

  $(function() 

    function rss() 
      $.getJSON("https://api.rss2json.com/v1/api.json?rss_url=https%3A%2F%2Fwww.stuff.co.nz%2Frss", function(data) 
        newsArray = [];
        for (var i = 0; i < data.items.length; i++) 
          newsArray[i] = (data.items[i].title);
        
        console.log(newsArray);
        listTicker(
          list: newsArray,
          startIndex: 0,
          trickerPanel: $('#newsPanel'),
          interval: 3 * 1000,
        );
      )
    

    rss();
  );
</script>
<div id='newsPanel' />

【讨论】:

我喜欢这种方法,因为它可以很好地遍历数组数据。但正如我在帖子中提到的,数组每 10 分钟接收一次新数据,当它接收到新数据时,显示的间隔和文本表现得很奇怪。显示的文本在新数据进入之前在数组位置显示文本,但是同时启动函数的新实例以将新数据也推出,这使得标题跳来跳去(ea实例想要显示)和与定义的间隔不同步 - 特别是当阵列数据翻转 2 次以上时。这些“旧实例”需要处理掉 您对我在评论中发布的问题有解决方案吗?基本上,问题在于函数的新实例,每次启动函数时,它似乎都会填充一个新数组而不是更新当前数组。我知道这几乎不引人注意,但是在几个小时的过程中(请记住,每 10 分钟处理一次新查询,并且应该将其数据加载到数组中),非常明显的是时间完全关闭了。它停止的时间超过指定的时间,跳跃元素的顺序等。非常感谢任何解决方案。干杯。

以上是关于在将元素推送到 HTML ID 时更新实时 JavaScript 数组的主要内容,如果未能解决你的问题,请参考以下文章

将对象 ID 推送到嵌套数组 MongoDB/Mongoose

将元素推送到猫鼬中的数组

内存优化 ios 应用程序,在将应用程序推送到后台最小化应用程序运行时内存大小时

将新数据推送到firebase数据库时设置自定义数字键

在javascript中将新元素推送到数组时出错

如何将新数据从实时数据库推送到 Cloud Firestore?