0

I need to call a Javascript function on <a> element click event. When the page will initially load it will display the temperature in °C. Later on user can click on temperature to change it from °C to °F and vice versa without page refresh.

Code :

HTML:

<html>
<script src="https://use.fontawesome.com/51b73c8fb8.js"></script>

<body>
  <div class="mainContainer">
    <div class="tempOutCont">
      <div class="tempInCont">
        <span id="headDetails"></span>
        <div id="iconTemp">
          <img id="icon"></img>
          <a id="unitLink" href="https://www.google.com"></a>
        </div>
        <span id="mainWeather"></span>
        <span id="detailsHead">Details</span>
        <div id="listDetails">
          <ul>
            <li>Wind<span id="windText" class="listDetailsItem"></span></li>
            <li>Pressure<span id="pressureText" class="listDetailsItem"></span></li>
            <li>Humidity<span id="humidText" class="listDetailsItem"></span></li>
            <li>Cloudiness<span id="cloudText" class="listDetailsItem"></span></li>
          </ul>
          <div>
          </div>
        </div>
      </div>
</body>

</html>

CSS:

html,
body {
  height: 100%;
  width: 100%;
  margin: 0;
  padding: 0;
}
.mainContainer {
  background-color: red;
  height: 100%;
  width: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}
.tempOutCont {
  background-color: white;
  height: 20em;
  width: 40em;
  border-radius: 1em;
  margin-bottom: 10em;
  display: flex;
  justify-content: center;
  align-items: center;
}
.tempInCont {
  background-color: blue;
  margin: 2em;
  width: 100%;
  height: 80%;
  border-radius: 1em;
  display: flex;
  flex-direction: column;
}
#headDetails {
  border: 0.1em white solid;
  text-align: left;
  margin-top: 1em;
}
#iconTemp {
  border: 0.1em white solid;
  display: flex;
  justify-content: space-around;
}
#mainWeather {
  text-align: center;
}
#detailsHead {
  text-align: center;
}
#listDetails {
  text-align: center;
}
li {
  margin-left: 10em;
  text-align: left;
}
.listDetailsItem {
  margin-left: 5em;
  text-align: left;
}
a {
  color: white;
}

JS:

/*<iframe src="https://codepen.io/shaan046/full/jaggro/" allow="geolocation"></iframe>*/
var appId = "675645ead57721be136750f9cfc0acca";
var unit;
var temperature;

var changeUnit = function changeUnit(unit, temperature) {
  console.log(unit);
  if (unit === "C") {
    temperature = temperature * 1.8 + 32;
    unit = "F";
    document.getElementById("unitLink").innerHTML = temperature + "°F";
  } else if (unit === "F") {
    temperature = (temperature - 32) / 1.8;
    unit = "C";
    document.getElementById("unitLink").innerHTML = temperature + "°C";
  } else if (unit === "K") {
    temperature = temperature - 273.15;
    unit = "C";
    document.getElementById("unitLink").innerHTML = temperature + "°C";
  }
  return false;
};

var getWeatherData = function getWeatherData() {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function showPosition(position) {
      var lat = String(position.coords.latitude);
      var lon = String(position.coords.longitude);
      $.ajax({
        type: "GET",
        url:
          "https://api.openweathermap.org/data/2.5/weather?lat=" +
          lat +
          "&lon=" +
          lon +
          "&appid=" +
          appId,
        success: function(json) {
          document.getElementById("headDetails").innerHTML =
            "Weather in " + json.name + "," + json.sys.country;
          document.getElementById("icon").src =
            "https://openweathermap.org/img/w/" + json.weather[0].icon + ".png";
          changeUnit("K", json.main.temp);
          document.getElementById("mainWeather").innerHTML =
            json.weather[0].main;
          document.getElementById("windText").innerHTML =
            json.wind.speed + "m/s";
          document.getElementById("pressureText").innerHTML =
            json.main.pressure + "hpa";
          document.getElementById("humidText").innerHTML =
            json.main.humidity + "%";
          document.getElementById("cloudText").innerHTML =
            json.clouds.all + "%";
        }
      });
    });
  } else {
    x.innerHTML = "Geolocation is not supported by this browser.";
  }
};
$(document).ready(function() {
  getWeatherData();
  $("#unitLink").onclick = changeUnit(unit, temperature);
});
6
  • 3
    What exactly is the problem you are having? Commented Dec 11, 2017 at 15:25
  • When i click on the text 17°C which is a anchor text i set using function call, nothing happens. The function call sets the text correctly by converting temperature from Kelvin(K) to Celcius(C). But after that nothing happens on <a> click. Commented Dec 11, 2017 at 15:28
  • 2
    This line $("#unitLink").onclick = changeUnit(unit, temperature); doesn't do what you think it does. It just adds a custom property to a jQuery object. Commented Dec 11, 2017 at 15:28
  • So what i want to to do here is call a function on click event. May be you can suggest a better way to do that. Thanks Commented Dec 11, 2017 at 15:29
  • Please take a look at the basics here. $("#unitLink") returns a jQuery object, then you're adding onclick property to that object, which eventually evaluates to false since changeUnit returns false. Or fails alltogether, if unit and/or temperature are not defined at the DOM ready. Commented Dec 11, 2017 at 15:33

2 Answers 2

1

Try using jQuery

$('#elementToChangeID').text("something");
Sign up to request clarification or add additional context in comments.

4 Comments

Thanks for the answer. My problem here is that the function has arguments passed into it. How can i pass value from JS to HTML in that case ? Won't be possible i guess.
Don't bind obtrusively into HTML. This is a bad practice.
Are you trying to edit HTML elements with values set by your JS?
Yes.. I need to do that
1

The proper way to bind events to DOM is:

<a href="#" id="someLink">link</a>

with JS:

$('#someLink').click(function(){
// do something
});

Not using the onclick in HTML.

The advantages are

  • behaviour (Javascript) is separated from presentation (HTML)
  • no mixing of languages
  • you're using a Javascript framework like jQuery that can handle most cross-browser issues for you
  • You can add behaviour to a lot of HTML elements at once without code duplication

1 Comment

I tried - $("#unitLink").click(changeUnit(unit, temperature)); Am i doing it right way ? As nothing happens on clicking.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.