Je crée une application météo à l'aide de javascript vanille et une fonctionnalité de l'application est de cliquer sur un bouton et de la laisser randomiser une nouvelle longitude et latitude afin qu'elle puisse changer l'emplacement et donc la température. Je suis entré dans un peu de liaison où chaque fois que je clique sur le bouton, rien ne se passe mais chaque fois que je console.log
, il apparaît dans la console:
<div class="container"> <div class="weather-container"> <h1 class="celcius">Celcius</h1> <h4 class="description">Sunny Day</h4> <h4 class="location">Planet Vegeta</h4> <div class="btn-div"> <button class="change-location-btn">Change Location</button> </div> </div> </div>
Je ne sais pas vraiment ce qui se passe.
.btn-div { height: 250px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: end; -ms-flex-align: end; align-items: flex-end; } .btn-div .change-location-btn { background-color: #f82626; color: white; outline: none; border: none; border-radius: 0px 0px 10px 10px; width: 100%; height: 50px; text-transform: uppercase; font-weight: 500; letter-spacing: 3px; font-size: 15px; -webkit-transition: 0.2s; transition: 0.2s; } .btn-div .change-location-btn:hover { background-color: #f56969; cursor: pointer; } * { margin: 0; padding: 0; -webkit-box-sizing: border-box; box-sizing: border-box; } body { background: linear-gradient(190deg, #77dfbc, #8b54e6); overflow: hidden; } .container { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; height: 100vh; } .weather-container { background-color: #f5e3e3; border-radius: 10px; height: 400px; width: 300px; -webkit-box-shadow: 0px 0px 10px 0px #131212b2; box-shadow: 0px 0px 10px 0px #131212b2; padding-top: 50px; text-align: center; font-family: 'Montserrat', sans-serif; } .weather-container h1 { font-size: 50px; margin-bottom: 2px; } .weather-container h4 { font-weight: 600; } /*# sourceMappingURL=style.css.map */
// Selectors const degreeCelcius = document.querySelector(".celcius"); const weatherDescription = document.querySelector(".description"); const changeLocationBtn = document.querySelector(".change-location-btn"); const weatherLocation = document.querySelector(".location"); // Event Listeners window.addEventListener("load", () => { let longitude; let latitude; if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(position => { longitude = position.coords.longitude; latitude = position.coords.latitude; // Here lies the problem changeLocationBtn.addEventListener("click", function() { longitude = (Math.random() * (80 + 180) + -180).toFixed(3); latitude = (Math.random() * (90 + 90) + -90).toFixed(3); console.log(latitude, longitude); }); const corsProxy = 'https://cors-anywhere.herokuapp.com/'; const api = `${corsProxy}http://api.weatherapi.com/v1/current.json?key=7391e8544809410cbf0120949201511&q=${latitude}, ${longitude}`; // Fetch data from the API fetch(api) .then(response => { return response.json(); }) .then(data => { console.log(data); const { temp_c, condition } = data.current; degreeCelcius.textContent = temp_c + '°C'; weatherDescription.textContent = condition.text; weatherLocation.textContent = data.location.name + ", " + data.location.country; }); }); } });
changeLocationBtn.addEventListener("click", function(){ longitude = (Math.random() * (80 + 180) + -180).toFixed(3); latitude = (Math.random() * (90 + 90) + -90).toFixed(3); console.log(latitude, longitude); });
3 Réponses :
Vous pouvez vérifier que changeLocationBtn existe vraiment et est trouvé lorsque l'auditeur est lié, il est également préférable d'ajouter le sélecteur changeLocationBtn près de changeLocationBtn.addEventListener pour vérifier s'il est toujours en contexte.
const changeLocationBtn = document.querySelector(".change-location-btn"); console.log('btn', changeLocationBtn ) changeLocationBtn.addEventListener("click", function() { longitude = (Math.random() * (80 + 180) + -180).toFixed(3); latitude = (Math.random() * (90 + 90) + -90).toFixed(3); console.log(latitude, longitude); });
Oui, je viens de vérifier et il semble que tout soit lié correctement mais que les coordonnées ne changent toujours pas.
Commencer ici:
// Event Listeners window.addEventListener("load", () => { let longitude; let latitude; const degreeCelcius = document.querySelector(".celcius"); const weatherDescription = document.querySelector(".description"); const changeLocationBtn = document.querySelector(".change-location-btn"); const weatherLocation = document.querySelector(".location"); // Here lies the problem changeLocationBtn.addEventListener("click", function() { longitude = (Math.random() * (80 + 180) + -180).toFixed(3); latitude = (Math.random() * (90 + 90) + -90).toFixed(3); console.log(latitude, longitude); });
Votre code actuel n'envoie qu'une seule donnée, lorsque la page est chargée. J'ai modifié le code JS pour qu'il fonctionne à la fois avec les événements onLoad et click. Mais le changement des données affichées est très lent. Et j'ai expérimenté que l'API météo ne fonctionnait qu'avec les coordonnées au sol, ne fonctionnant pas dans les mers et les océans.
const degreeCelcius = document.querySelector(".celcius"); const weatherDescription = document.querySelector(".description"); const changeLocationBtn = document.querySelector(".change-location-btn"); const weatherLocation = document.querySelector(".location"); const corsProxy = 'https://cors-anywhere.herokuapp.com/'; function change_location(longitude,latitude){ const api = ${corsProxy}http://api.weatherapi.com/v1/current.json?key=7391e8544809410cbf0120949201511&q=${latitude}, ${longitude}`; // Fetch data from the API fetch(api) .then(response => { //console.log(response); return response.json(); }) .then(data => { console.log(data); const { temp_c, condition } = data.current; degreeCelcius.textContent = temp_c + '°C'; weatherDescription.textContent = condition.text; weatherLocation.textContent = data.location.name + ", " + data.location.country; }); } // Event Listeners window.addEventListener("load", () => { let longitude; let latitude; if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(position => { longitude = position.coords.longitude; latitude = position.coords.latitude; console.log("Current location: " + latitude, longitude); change_location(longitude,latitude); }); } }); changeLocationBtn.addEventListener("click", function() { longitude = (Math.random() * (80 + 180) + -180).toFixed(3); latitude = (Math.random() * (90 + 90) + -90).toFixed(3); console.log(latitude, longitude); change_location(longitude,latitude); });`
Oui, cela a fonctionné merci. Selon vous, quelle pourrait être la raison pour laquelle les données se chargent si lentement?
Je pense que le processus des données de géolocalisation côté serveur est lent, le problème n'est pas dans votre site. Maintenant, j'ai lu d'autres portails similaires, d'autres utilisateurs ont également connu une réponse lente de l'API (et d'autres API météo)
Êtes-vous sûr que
getCurrentPosition
est exécuté correctement et ne renvoie aucune erreur? Parce que vous ne gérez pas ses erreurs potentielles. Ajoutez une deuxième fonction de rappel, en enregistrant les erreurs potentielles (problèmes CORS, etc.). Parce que vous attachez l'événement de clic uniquement dans le cas oùgetCurrentPosition
s'est bien passé.Dans les extraits ici: La
Geolocation has been disabled in this document by Feature Policy.
Définissez le type de
<button class="change-location-btn">Change Location</button>
sur buttontype="button"
car le type par défaut est 'soumettre', qui est envoyer le formulaire et actualiser la pageOk, juste changé, les coordonnées ne changent toujours pas