HTML img src 没有动态更新

Posted

技术标签:

【中文标题】HTML img src 没有动态更新【英文标题】:HTML img src not updating dynamically 【发布时间】:2017-12-05 15:37:25 【问题描述】:

在我的desktop app 的一部分中,我编写了一个函数,它根据 json 文件的输出(更改)更新/重写 html div 文本和图像源,但是 img src 没有改变和它一起。

应用的外观like。当文本(新闻标题)发生变化时,“徽标”图像应该会发生变化。

这是function的一部分:

function newsAPI()
  for(i = 0; i<config['newsapi']['sources'].length;i++) 
    document.getElementById('news_icon').src="img/news/" + config['newsapi']['sources'][i] + ".png";
    request(
      url: 'https://newsapi.org/v1/articles?source=' + config['newsapi']['sources'][i] + '&sortBy=top&apiKey=' + config['newsapi']['api_key'],
      method: 'get'
    , function (err, res, body)
      var parsedbody = JSON.parse(body)
      parsedbody = parsedbody['articles'];
      document.getElementById('news_1').innerHTML = parsedbody[0]['title'];
      document.getElementById('news_2').innerHTML = parsedbody[1]['title'];
      document.getElementById('news_3').innerHTML = parsedbody[2]['title'];
      document.getElementById('news_4').innerHTML = parsedbody[3]['title'];
      document.getElementById('news_5').innerHTML = parsedbody[4]['title'];

    )
      sleep(10000);
  

此函数从 API 获取新闻标题作为 json 数据。 config['newsapi']['sources'][i] 匹配目录中图片的名称(config['newsapi']['sources'] 是一个列表)

这是 HTML 的相关部分:

    <div id="img" class ="image"></div>
    <img id="news_icon" class="news_head" />
    <div id="news_1" class ="news"></div>
    <div id="news_2" class ="news"></div>

我的睡眠功能:

function sleep(ms) 
  return new Promise(resolve => setTimeout(resolve, ms));

【问题讨论】:

我们不想/不需要看到所有这些代码。只包括代码的相关部分或去MCVE config['newsapi']['sources'] 有多少个? 请取回您的 JS 代码,因为它是相关的。 @UsagiMiyamoto,我现在已经编辑了代码。 config['newsapi']['sources'] 是一个列表(所以元素的数量是任意的) 【参考方案1】:

问题出在这一行:

document.getElementById('news_icon').src="img/news/" + config['newsapi']['sources'][i] + ".png";

在该行之前添加console.log(config['newsapi']['sources'][i]); 并检查输出。

检查以下内容:

可能config['newsapi']['sources'] 没有字符串或路径错误。 或者字符串是这样的“bbc.png”,意思是图片的“src”属性获取的值是“img/news/bbc.png.png”(双.png) 或者返回的路径包含完整路径,导致“img/news/img/news/bbc.png” 或者图片链接是正确的,只是图片在路径“img/news”中不存在。

编辑:

您可能想做的是 1. 向服务器发出请求,2. 然后等待 10 秒。

您的代码将无法按预期工作,因为 request 是一个异步函数,这意味着它不会等待 sleep 函数。

以下是使用异步函数的方法。我将您的迭代代码放在setTimeout 函数中:

function newsAPI() 
    for(i = 0; i<config['newsapi']['sources'].length; i++) 
        setTimeout(function() 
            document.getElementById('news_icon').src = "img/news/" + config['newsapi']['sources'][i] + ".png";
            request(
                url: 'https://newsapi.org/v1/articles?source=' + config['newsapi']['sources'][i] + '&sortBy=top&apiKey=' + config['newsapi']['api_key'],
                method: 'get'
                , function (err, res, body)
                    var parsedbody = JSON.parse(body)
                    parsedbody = parsedbody['articles'];
                    document.getElementById('news_1').innerHTML = parsedbody[0]['title'];
                    document.getElementById('news_2').innerHTML = parsedbody[1]['title'];
                    document.getElementById('news_3').innerHTML = parsedbody[2]['title'];
                    document.getElementById('news_4').innerHTML = parsedbody[3]['title'];
                    document.getElementById('news_5').innerHTML = parsedbody[4]['title'];
                );
        , 10000 * i);
    

编辑 2:

function newsAPI() 
    for(i = 0; i<config['newsapi']['sources'].length; i++) 
        setTimeout(function() 
            document.getElementById('news_icon').src = "img/news/" + config['newsapi']['sources'][i] + ".png";
            request(
                url: 'https://newsapi.org/v1/articles?source=' + config['newsapi']['sources'][i] + '&sortBy=top&apiKey=' + config['newsapi']['api_key'],
                method: 'get'
                , function (err, res, body)
                    var parsedbody = JSON.parse(body)
                    parsedbody = parsedbody['articles'];
                    document.getElementById('news_1').innerHTML = parsedbody[0]['title'];
                    document.getElementById('news_2').innerHTML = parsedbody[1]['title'];
                    document.getElementById('news_3').innerHTML = parsedbody[2]['title'];
                    document.getElementById('news_4').innerHTML = parsedbody[3]['title'];
                    document.getElementById('news_5').innerHTML = parsedbody[4]['title'];
                    if(i+1 == config['newsapi']['sources'].length) // if is last iteration, repeat again
                        setTimeout(newsAPI, 10000);
                    
                );
        , 10000 * i);
    

【讨论】:

好的,所以我添加了打印语句来单步执行循环。它只是吐出每次迭代,然后在循环结束时在最后休眠......这很奇怪。 @JC1 我不觉得奇怪。注释掉或删除sleep(10000) 看看会发生什么 for 循环以正确的顺序打印,但睡眠发生在整个 for 循环完成后。我认为这是问题 @JC1 request 函数是异步的,这意味着它不会等待睡眠函数。我已经编辑了我的答案。 谢谢!它现在可以工作了,有一些变化(声明匿名函数以便它可以使用计数器变量)【参考方案2】:

上周发生在我身上,

试试这个

document.getElementById('news_icon').src="img/news/" + config['newsapi']['sources'][i] + new Date().getTime() + ".png";

【讨论】:

不幸的是,仍然无法正常工作。 img 标签正在更新,但 src 与第一个标签相比没有变化。

以上是关于HTML img src 没有动态更新的主要内容,如果未能解决你的问题,请参考以下文章

javascript怎么动态更改img标签的src属性?

javascript怎么动态更改img标签的src属性?

img src 没有更新

当Vue中img的src是动态渲染时不显示问题

vue中img的src动态渲染不显示问题

javascript html update img src - 这有啥问题? [复制]