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

新手开发者求助:如何在网站添加本地天气与时间组件

解决天气模块实现的分步方案

Hey there! 先给你点个赞——已经把本地时间功能搞定了,这可是迈出了很棒的第一步!咱们一步步来解决天气模块的问题,顺便先修正你现有代码里的小bug:你写的<div id="txt"</div>标签没正确闭合,得改成<div id="txt"></div>,不然可能会导致页面渲染异常哦。

接下来咱们按你的思路,从IP定位到天气API调用,把功能完整实现:

1. 通过IP获取地理位置信息

你可以用免费的IP地理查询服务来获取用户的大致位置(比如城市、经纬度),这里用ip-api.com的接口示例(无需API密钥,适合测试阶段使用):

async function getLocationByIP() {
  try {
    const response = await fetch('http://ip-api.com/json/');
    const data = await response.json();
    if (data.status === 'success') {
      return {
        city: data.city,
        lat: data.lat,
        lon: data.lon
      };
    } else {
      throw new Error('Failed to get location');
    }
  } catch (error) {
    console.error(error);
    // 如果IP定位失败,可以给用户提示,后续还能加手动输入城市的备选功能
    document.getElementById('location').innerHTML = '无法检测位置';
    return null;
  }
}

2. 调用天气API获取天气数据

拿到地理位置后,咱们用经纬度调用天气API,比如OpenWeatherMap(需要去官网注册免费账号获取API密钥)。示例代码如下:

async function getWeatherData(lat, lon, apiKey) {
  try {
    const response = await fetch(`https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${apiKey}&units=metric`);
    const data = await response.json();
    return {
      temperature: `${data.main.temp}°C`,
      description: data.weather[0].description.charAt(0).toUpperCase() + data.weather[0].description.slice(1),
      city: data.name
    };
  } catch (error) {
    console.error('天气数据获取失败:', error);
    document.getElementById('weather').innerHTML = '无法加载天气信息';
    return null;
  }
}

3. 整合所有功能并更新页面

把定位、天气查询和你的时间显示功能整合起来,同时在HTML里添加位置和天气的显示区域,完整代码如下:

<!DOCTYPE html> 
<html> 
<head> 
  <style> 
    table { 
      font-family:Arial, Helvetica, sans-serif; 
      font-size:24px; 
      border-collapse: collapse;
    }
    td {
      padding: 10px;
      border: 1px solid #ddd;
    }
  </style> 
</head> 
<body onload="init()"> 
  <table> 
    <tr>
      <td>Current Local Time:</td>
      <td><div id="txt"></div></td>
    </tr>
    <tr>
      <td>Your Location:</td>
      <td><div id="location"></div></td>
    </tr>
    <tr>
      <td>Current Weather:</td>
      <td><div id="weather"></div></td>
    </tr>
  </table>

  <script> 
    // 替换成你自己的OpenWeatherMap API密钥
    const WEATHER_API_KEY = 'YOUR_API_KEY_HERE';

    function startTime() { 
      var today = new Date(); 
      var h = today.getHours(); 
      var m = today.getMinutes(); 
      var s = today.getSeconds(); 
      m = checkTime(m); 
      s = checkTime(s); 
      document.getElementById('txt').innerHTML = `${h}:${m}:${s}`; 
      setTimeout(startTime, 500); 
    } 

    function checkTime(i) { 
      if (i < 10) {i = "0" + i}; 
      return i; 
    }

    async function getLocationByIP() {
      try {
        const response = await fetch('http://ip-api.com/json/');
        const data = await response.json();
        if (data.status === 'success') {
          return {
            city: data.city,
            lat: data.lat,
            lon: data.lon
          };
        } else {
          throw new Error('Failed to retrieve location');
        }
      } catch (error) {
        console.error(error);
        document.getElementById('location').innerHTML = '无法检测位置';
        return null;
      }
    }

    async function getWeatherData(lat, lon) {
      try {
        const response = await fetch(`https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${WEATHER_API_KEY}&units=metric`);
        const data = await response.json();
        return {
          temp: `${data.main.temp}°C`,
          desc: data.weather[0].description.charAt(0).toUpperCase() + data.weather[0].description.slice(1),
          city: data.name
        };
      } catch (error) {
        console.error('天气数据获取失败:', error);
        document.getElementById('weather').innerHTML = '无法加载天气信息';
        return null;
      }
    }

    async function init() {
      // 启动时间显示
      startTime();

      // 获取位置
      const locationData = await getLocationByIP();
      if (locationData) {
        document.getElementById('location').innerHTML = locationData.city;
        
        // 获取天气
        const weatherData = await getWeatherData(locationData.lat, locationData.lon);
        if (weatherData) {
          document.getElementById('weather').innerHTML = `${weatherData.desc}, ${weatherData.temp}`;
        }
      }
    }
  </script> 
</body> 
</html>

关键注意事项

  • API密钥:一定要去OpenWeatherMap官网注册免费账号,获取自己的API密钥替换代码里的YOUR_API_KEY_HERE,不然天气接口会调用失败。
  • 跨域问题:如果你的网站是HTTPS协议,调用ip-api.com的HTTP接口会被浏览器拦截,这时候可以改用支持HTTPS的IP服务(比如ipgeolocation.io,同样需要免费密钥)。
  • 容错处理:IP定位可能存在不够精准或者失败的情况,后续可以考虑添加手动选择城市的功能,提升用户体验。

你已经搞定了最核心的时间模块,现在只要替换API密钥测试这段代码,应该就能正常运行啦!如果遇到报错,先看浏览器控制台的错误信息,大部分问题都是密钥错误或者跨域配置的问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:27:41