0
votes

Avoir du mal à changer la longitude et la latitude dans l'application Javascript

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);
            });


4 commentaires

Ê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 button type="button" car le type par défaut est 'soumettre', qui est envoyer le formulaire et actualiser la page


Ok, juste changé, les coordonnées ne changent toujours pas


3 Réponses :


0
votes

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);
  });


1 commentaires

Oui, je viens de vérifier et il semble que tout soit lié correctement mais que les coordonnées ne changent toujours pas.



0
votes

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);
  });


0 commentaires

1
votes

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);
});`


2 commentaires

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)