如何在不询问位置的情况下工作天气

Posted

技术标签:

【中文标题】如何在不询问位置的情况下工作天气【英文标题】:How to work weather without asking location 【发布时间】:2020-03-06 06:12:35 【问题描述】:

我创建了天气应用程序,它会在所有重新加载时询问位置“允许或阻止”,当我单击阻止时,每次重新加载后天气都不起作用。问题是,我想更改代码,我想在不询问允许或阻止的情况下工作天气,我想立即显示它,请帮助我。谢谢。

这是我的代码





  const iconElement = document.querySelector(".weather-icon");
  const tempElement = document.querySelector(".temperature-value p");
  const descElement = document.querySelector(".temperature-description p");
  const locationElement = document.querySelector(".location p");
  const notificationElement = document.querySelector(".notification");

  // App data
  const weather = ;

  weather.temperature = 
      unit : "celsius"
  

  // APP CONSTS AND VARS
  const KELVIN = 273;
  // API KEY
  const key = "82005d27a116c2880c8f0fcb866998a0";

  // CHECK IF BROWSER SUPPORTS GEOLOCATION
  if('geolocation' in navigator)
      navigator.geolocation.getCurrentPosition(setPosition, showError);
  else
      notificationElement.style.display = "block";
      notificationElement.innerhtml = "<p>Browser doesn't Support Geolocation</p>";
  

  // SET USER'S POSITION
  function setPosition(position)
      let latitude = position.coords.latitude;
      let longitude = position.coords.longitude;

      getWeather(latitude, longitude);
  

  // SHOW ERROR WHEN THERE IS AN ISSUE WITH GEOLOCATION SERVICE
  function showError(error)
      notificationElement.style.display = "block";
      notificationElement.innerHTML = `<p> $error.message </p>`;
  

  // GET WEATHER FROM API PROVIDER
  function getWeather(latitude, longitude)
      let api = `http://api.openweathermap.org/data/2.5/weather?lat=$latitude&lon=$longitude&appid=$key`;

      fetch(api)
          .then(function(response)
              let data = response.json();
              return data;
          )
          .then(function(data)
              weather.temperature.value = Math.floor(data.main.temp - KELVIN);
              weather.description = data.weather[0].description;
              weather.iconId = data.weather[0].icon;
              weather.city = data.name;
              weather.country = data.sys.country;
          )
          .then(function()
              displayWeather();
          );
  

  // DISPLAY WEATHER TO UI
  function displayWeather()
      iconElement.innerHTML = `<img src="icons/$weather.iconId.png"/>`;
      tempElement.innerHTML = `$weather.temperature.value°<span>C</span>`;
      descElement.innerHTML = weather.description;
      locationElement.innerHTML = `$weather.city, $weather.country`;
  

  // C to F conversion
  function celsiusToFahrenheit(temperature)
      return (temperature * 9/5) + 32;
  

  // WHEN THE USER CLICKS ON THE TEMPERATURE ELEMENET
  tempElement.addEventListener("click", function()
      if(weather.temperature.value === undefined) return;

      if(weather.temperature.unit == "celsius")
          let fahrenheit = celsiusToFahrenheit(weather.temperature.value);
          fahrenheit = Math.floor(fahrenheit);

          tempElement.innerHTML = `$fahrenheit°<span>F</span>`;
          weather.temperature.unit = "fahrenheit";
      else
          tempElement.innerHTML = `$weather.temperature.value°<span>C</span>`;
          weather.temperature.unit = "celsius"
      
  );




html



    <div class="container">
            <div class="app-title">
                <p>Weather</p>
            </div>
            <div class="notification"> </div>
            <div class="weather-container">
                <div class="weather-icon">
                    <img src="icons/unknown.png" >
                </div>
                <div class="temperature-value">
                    <p>- °<span>C</span></p>
                </div>
                <div class="temperature-description">
                    <p> - </p>
                </div>
                <div class="location">
                    <p>-</p>
                </div>
            </div>
        </div>



【问题讨论】:

【参考方案1】:

出于安全原因,如果您尝试使用 javascript 进行操作,浏览器无法询问用户是否愿意透露他的位置。

但是,您可能希望通过 IP 来查看地理位置,这并不准确(如果用户使用 *** 根本不起作用),但也许是一种适合您的方法。

这会让你开始:https://whatismyipaddress.com/geolocation

【讨论】:

【参考方案2】:

您还可以向http://ip-api.com/json 发出获取请求并使用其中的数据。

【讨论】:

以上是关于如何在不询问位置的情况下工作天气的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不启动核心定位的情况下向用户询问当前位置

如何查之前的天气

如何在不询问密码提示的情况下自动执行rsync [关闭]

如何在不移动地图的情况下更改 GMSMapView 填充

如何在不清除 GoogleMap 的情况下更新多个位置

如何在不重置位置的情况下更改 UIButton?