<h1>Sunrise/Sunset times</h1>
<form>
<label for="">lat: <input type="number" min="-90" max="90" id="lat"></label>
<label for="">long: <input type="number" min="-180" max="180" id="long"></label>
</form>
<div class="sunrise">Sunrise: <span class="time"></span></div>
<div class="sunset">Sunset: <span class="time"></span></div>
body {
padding: 0 10px;
}
input {
width: 8em;
}
function debounced(delay, fn) {
let timerId;
return function(args) {
if (timerId) {
clearTimeout(timerId);
}
timerId = setTimeout(() => {
fn(args);
timerId = null;
}, delay);
};
}
function updateTimes(lat, long) {
if (lat && long) {
return fetch(`https://api.sunrise-sunset.org/json?lat=${lat}&lng=${long}`)
.then(response => {
if (!response.ok) {
sunriseTimeElement.innerHTML = "Invalid";
sunsetTimeElement.innerHTML = "Invalid";
throw Error(`${response.status} response on times request`);
}
return response.json();
})
.then(data => {
sunriseTimeElement.innerHTML = data.results.sunrise;
sunsetTimeElement.innerHTML = data.results.sunset;
})
.catch(error => {
console.error(error.message);
});
}
}
function updateTimesFromInput() {
const lat = latField.value;
const long = longField.value;
updateTimes(lat, long);
}
const updateTimesFromInputDebounced = debounced(500, updateTimesFromInput);
const sunriseTimeElement = document.querySelector(".sunrise .time");
const sunsetTimeElement = document.querySelector(".sunset .time");
const latField = document.querySelector("#lat");
const longField = document.querySelector("#long");
navigator.geolocation.getCurrentPosition(function(position) {
const lat = position.coords.latitude;
const long = position.coords.longitude;
latField.value = lat;
longField.value = long;
updateTimes(lat, long);
});
[latField, longField].forEach(field => {
const events = ["keyup", "change", "input"];
events.forEach(event => {
field.addEventListener(event, updateTimesFromInputDebounced);
});
});
This Pen doesn't use any external JavaScript resources.