You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关联搜索与展示函数实现NewsAPI新闻动态更新?

问题解决方法

核心问题是你当前的displayNews函数固定调用无参数的searchNews(),而搜索操作获取到的新数据没有传递给它来更新页面。下面是具体修改步骤:

1. 重构displayNews函数

让它直接接收新闻数据作为参数,不再内部调用searchNews,这样就能复用它渲染不同的搜索结果:

const displayNews = (newsData) => {
  // 空数据判断,避免无新闻时报错
  if (!newsData?.articles?.length) {
    bigNews.innerHTML = "<p>暂无新闻数据</p>";
    return;
  }
  const firstArticle = newsData.articles[0];
  bigNews.innerHTML = `
    <div class="card">
      <div>
        <img id="bigNewsImg" src="${firstArticle.urlToImage || 'https://via.placeholder.com/400x200?text=No+Image'}" 
             class="card-img-top" 
             alt="${firstArticle.title}"> 
        <button onclick="favoriteArticle(id)" 
                id="${firstArticle.title}">Save</button>
      </div>
      <div class="card-body">
        <div class="card-title">${firstArticle.title}</div>
        <a id="${firstArticle.url}" onclick="userArticles(id)" 
           target="_blank" 
           href="${firstArticle.url}" class="btnLink">Read more</a>
      </div>
    </div>
  `; 
};
  • 修复了原代码里的模板字符串语法错误(比如<div&quot;&gt;和href处的反引号问题)
  • 给图片加了默认地址兜底,避免图片链接为空时显示异常
  • 增加空数据判断,提升页面容错性

2. 修改搜索事件回调

在输入框回车搜索后,调用displayNews并传入获取到的新闻数据:

// 提前获取input元素,避免每次事件里重复查询DOM
const input = document.getElementById("input");

input.addEventListener("keyup", function (e)  {
  e.preventDefault();
  if (e.keyCode === 13) {
    const searchKeyword = input.value.trim();
    if (!searchKeyword) return; // 空关键词不发起无效请求
    searchNews(searchKeyword).then((data) => {
      displayNews(data); // 拿到新数据后直接更新页面
    }).catch(err => {
      console.error('获取新闻失败:', err);
      bigNews.innerHTML = "<p>获取新闻失败,请稍后重试</p>";
    });
  }
});

3. 初始页面渲染

调用searchNews时传入默认关键词(比如"technology",可根据需求修改),再传入displayNews完成初始加载:

// 初始加载默认新闻
searchNews("technology").then(displayNews).catch(err => {
  console.error('初始加载新闻失败:', err);
  bigNews.innerHTML = "<p>初始加载新闻失败,请稍后重试</p>";
});

完整修正后的代码

const apiKey = "xxxx"; //API Key
const input = document.getElementById("input");
const bigNews = document.getElementById("bigNews"); // 确保已获取该DOM元素

const searchNews = async (input) => {
  const response = await fetch(
    `https://newsapi.org/v2/everything?q=${input}&apiKey=${apiKey}`
  );
  if (!response.ok) {
    throw new Error(`请求失败:${response.status}`);
  }
  const data = await response.json();
  return data;
};

const displayNews = (newsData) => {
  if (!newsData?.articles?.length) {
    bigNews.innerHTML = "<p>暂无新闻数据</p>";
    return;
  }
  const firstArticle = newsData.articles[0];
  bigNews.innerHTML = `
    <div class="card">
      <div>
        <img id="bigNewsImg" src="${firstArticle.urlToImage || 'https://via.placeholder.com/400x200?text=No+Image'}" 
             class="card-img-top" 
             alt="${firstArticle.title}"> 
        <button onclick="favoriteArticle(id)" 
                id="${firstArticle.title}">Save</button>
      </div>
      <div class="card-body">
        <div class="card-title">${firstArticle.title}</div>
        <a id="${firstArticle.url}" onclick="userArticles(id)" 
           target="_blank" 
           href="${firstArticle.url}" class="btnLink">Read more</a>
      </div>
    </div>
  `; 
};

// 初始加载默认新闻
searchNews("technology").then(displayNews).catch(err => {
  console.error('初始加载新闻失败:', err);
  bigNews.innerHTML = "<p>初始加载新闻失败,请稍后重试</p>";
});

input.addEventListener("keyup", function (e)  {
  e.preventDefault();
  if (e.keyCode === 13) {
    const searchKeyword = input.value.trim();
    if (!searchKeyword) return;
    searchNews(searchKeyword).then((data) => {
      displayNews(data);
    }).catch(err => {
      console.error('获取新闻失败:', err);
      bigNews.innerHTML = "<p>获取新闻失败,请稍后重试</p>";
    });
  }
});

额外提示

  • 确保bigNews元素已正确获取(原代码未体现这一步,需补充)
  • 增加了请求失败的错误处理,给用户友好提示
  • 对输入关键词做了去空格处理,避免无效请求

内容的提问来源于stack exchange,提问作者Tange007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:25:25