Я пытаюсь вернуть выбранный в данный момент параметр из функции getSelectedCurrency, по умолчанию параметр выбора валюты выбран, но отключен.Теперь я пытаюсь заставить функцию возвращать выбранный в данный момент параметр, только когда есть другие параметры в элементах выбора и когда элемент выбора изменяется.
Я пытался добавить прослушиватель событий onchange, но не могу вернутьсячто-либо в самой функции, так как обработчики событий возвращают неопределенное значение по умолчанию, поэтому к моменту вызова getSelectedCurrency
она не возвращает ничего, что мне не нужно.
Я также пытался добавить прослушиватель событий onchange
вфункция populateCurrencies
, позволяющая зарегистрировать событие достаточно рано .... но когда я вызываю getSelectedCurrency()
сразу после его объявления (и после объявления populateCurrencies()
), возвращается только значение по умолчанию (т. е. выберите текст валюты)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Mini App</title>
<style>
body{
background-color:#fff;
margin:15px;
}
.select{
margin-top:50px;
}
.conversion{
margin:25px 0px;
}
.btn{
width:100%;
font-size:1.2rem;
padding:1rem;
}
</style>
</head>
<body>
<h1>Naira Converted</h1>
<div class="select-currency select">
<select class="select-text">
<option selected disabled>Select Currency</option>
</select>
<button type="submit" class="btn">In Naira</button>
<div class="conversion mdc-elevation--z3"></div>
<div class="messages"></div>
</div>
<script>
const currencies = [{
id: 'USD', name: 'US Dollars'
}, {
id: 'UGX', name: 'Ugandan Shillings'
}, {
id: 'KES', name: 'Kenyan Shillings'
}, {
id: 'GHS', name: 'Ghanian Cedi'
}, {
id: 'ZAR', name: 'South African Rand'
}];
const apiBase = 'https://free.currencyconverterapi.com/api/v6/';
const api = (currency) => `
${apiBase}convert?q=${currency}_NGN&compact=ultra
`;
const toast = (msg) => {
const toastr = document.querySelector('.messages');
if(!toastr) return;
toastr.textContent = msg;
if(!toastr.classList.contains('on')) {
toastr.classList.add('on');
}
};
const doneToasting = () => {
const toastr = document.querySelector('.messages');
if(!toastr) return;
toastr.textContent = '';
toastr.classList.remove('on');
};
const conversionSucceeded = (apiResponse) => {
if(!apiResponse) {
toast(`nothing to display ...`);
return;
}
const [value] = Object.values(apiResponse)
const btn = document.querySelector('button');
btn.removeAttribute('disabled');
const display = document.querySelector('.conversion');
const formatter = new Intl.NumberFormat(
'en-NG', { style: 'currency', currency: 'NGN' }
);
display.textContent = formatter.format(value);
doneToasting();
};
// declare populateCurrencies here
const populateCurrencies = ()=>{
currencies.forEach((x)=>{
let elt = document.querySelector('.select-text');
let newElt = document.createElement('option');
let newText = document.createTextNode(x.name);
newElt.appendChild(newText);
newElt.setAttribute('value',x.id);
elt.appendChild(newElt);
})
let elt = document.querySelector('.select-text');
elt.addEventListener('change',()=>{
let currentlySelected =document.querySelector('[selected]');
currentlySelected.removeAttribute('selected');
elt.selectedOptions[0].setAttribute('selected','');
console.log(getSelectedCurrency());
},false)
}
const getSelectedCurrency=()=>{
// here, determine and return the selected value
// of the SELECT element
let currentlySelected= document.querySelector('.select-text');
let value= currentlySelected.selectedOptions[0].textContent;
return(value) ;
};
const selected = getSelectedCurrency();
console.log(selected);
const convert = (event) => {
toast(`preparing to convert ...`);
const btn = event ?
event.target : document.querySelector('button');
const selected = getSelectedCurrency();
if(!selected || selected.trim() === ''
|| !currencies.map(c => c.id).includes(selected)) return;
btn.setAttribute('disabled', 'disabled');
toast(`converting ...`);
const endpoint = api(selected);
// make a GET fetch call to the endpoint
// variable declared above, convert the response to JSON,
// then call conversionSucceeded and pass the JSON data to it
};
const startApp = () => {
// call populateCurrencies here
populateCurrencies();
// add a click listener to the button here
document.querySelector('button').addEventListener('click',(event)=>
{convert(event)},false);
};
startApp();
</script>
</body>
</html>
Я ожидаю, что вызов getSelectedCurrency
должен вернуть текущую выбранную опцию, и когда изменение произойдет, оно также должно вернуть это изменение, но оно вернет только значение по умолчанию.