Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Отображение курса по клику (https://javascript.ru/forum/events/81712-otobrazhenie-kursa-po-kliku.html)

seven8959 15.01.2021 22:47

Отображение курса по клику
 
Всем добрый вечер. Нужна помощь. Есть как бы виджет курса валют, но высвечиваются все сразу. Хотелось бы, что бы каждая валютная пара, появлялась по клику на кнопку. При загрузке страницы, Должна сразу появляться первая валютная пара, а ниже 4 кнопки. И соответственно, когда нажимаешь на другую кнопку, виджет перерисовывается. Ниже кот js, и разметка HTML. То, что у меня не получается находится в loadCourse()
Заранее всем спасибо.

class CoursView {
    constructor() {
        this.courseList = document.querySelector('#exchange_rates');
        this.courseWidget = document.querySelector('.course_widget');
    }

   
    renderCours(ccy, base_ccy, buy, sale) {
        let li = document.createElement("li");
        let currency = document.createElement("h3");
        let course = document.createElement("p");
        let courseUsd = document.querySelector('.usd');
        let courseEuro = document.querySelector('.euro');
        let courseRur = document.querySelector('.rur');
        let courseBtc = document.querySelector('.btc');
        
        currency.innerText = ccy;     
        course.innerText = `Продажа: ${(buy*1).toFixed(2)}${base_ccy} / Покупка: ${(sale*1).toFixed(2)}${base_ccy}`;

        this.courseList.append(li);
        li.append(currency, course);       
    }


    courseError(msg) {
        this.clearCourse();
        let li = document.createElement("li");
        li.innerText = `Ошибка: ${msg}`;
        this.courseList.appendChild(li);
    }


    clearCourse() {
        this.courseList.innerHTML = '';
    }
}



class CoursModel {
    constructor() {
        this.courses = [];
    }


    setCourses(courses) {
        this.courses = courses;
    }


    clear() {
        this.courses = [];
    }
}



class CoursControler {
    constructor(model, view) {
        this.model = model;
        this.view = view;
        this.loadCourse = this.loadCourse;
    }


    handle() {
        this.loadCourse();
        setInterval(this.loadCourse, 3600000);
    }


    loadCourse = () => {
        this.model.clear();
        fetch('https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5')
            .then(res => res.json())
            .then(result => {
                this.model.setCourses(result);
            })
            .catch(err => {
                console.log(err);
            })
            .finally(() => {
                this.view.clearCourse();
                if(this.model.courses.length === 0) return this.view.courseError('Нет данных');
                this.view.courseWidget.addEventListener('click', function(e) {         
                    if (e.target.className == '.usd') {
                        this.model.courses.forEach(item => this.view.renderCours(item.ccy, item.base_ccy, item.buy, item.sale)[0]);
                    }
                    else if (e.target.className =='.euro') {
                        this.model.courses.forEach(item => this.view.renderCours(item.ccy, item.base_ccy, item.buy, item.sale)[1]);
                    }
                    else if (e.target.className =='.rur') {
                        this.model.courses.forEach(item => this.view.renderCours(item.ccy, item.base_ccy, item.buy, item.sale)[2]);
                    }
                    else if (e.target.className =='.btc') {
                        this.model.courses.forEach(item => this.view.renderCours(item.ccy, item.base_ccy, item.buy, item.sale)[3]);
                    }
                })
            });
    }

}


const coursView = new CoursView();
const coursModel = new CoursModel();
const coursController = new CoursControler(coursModel, coursView);

coursController.handle();



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Weather App</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    <script defer
        src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAcvZd2PPPPz3OD3VHpl_X9xOxesl80-cU&libraries=places&callback=initMap">
    </script>
    <script defer src="googleMaps.js"></script>
    <script defer src="app.js"></script>
    <script defer src="userWeather.js"></script>
    <script defer src="course.js"></script>
</head>
    <body> 
        <div class="container">
        <h1>Погода</h1>    
        <header>
            <input type="text" class="city" placeholder="Введите город" required>
            <button type="submit" class="cityBtn">Показать</button>
        </header>
        <section class="dateNow">
            <h3 class="date"></h3>
        </section>
        <section>
            <ul id="weather"></ul>  
            <div class="block_weather">
                <ul id="user_weather">
                    <li id="current_weather">
                        <h2>Ваш город</h2>
                        <h3 id="current_city">Неизвестно</h3>
                        <div id="temperature">null</p>
                    </li>
                </ul>
            </div>
            <div class="course_widget">
                <h2>Курс валют</h2>
                <ul id="exchange_rates"></ul>
                <button class="usd">USD</button>
                <button class="euro">EURO</button>
                <button class="rur">RUR</button>
                <button class="btc">BTC</button>
            </div>
        </section> 
    </div>   
</body>
</html>

рони 16.01.2021 00:14

seven8959,
медитируйте, и возможно исправлено не всё
class CoursView {
    constructor() {
        this.courseList = document.querySelector('#exchange_rates');
        this.courseWidget = document.querySelector('.course_widget');
        this.clearCourse = this.clearCourse.bind(this);
    }


    renderCours(ccy, base_ccy, buy, sale) {
        let li = document.createElement("li");
        let currency = document.createElement("h3");
        let course = document.createElement("p");
        let courseUsd = document.querySelector('.usd');
        let courseEuro = document.querySelector('.euro');
        let courseRur = document.querySelector('.rur');
        let courseBtc = document.querySelector('.btc');

        currency.innerText = ccy;
        course.innerText = `Продажа: ${(buy*1).toFixed(2)}${base_ccy} / Покупка: ${(sale*1).toFixed(2)}${base_ccy}`;

        this.courseList.append(li);
        li.append(currency, course);

    }


    courseError(msg) {
        this.clearCourse();
        let li = document.createElement("li");
        li.innerText = `Ошибка: ${msg}`;
        this.courseList.appendChild(li);
    }


    clearCourse() {
        this.courseList.innerHTML = '';
    }
}



class CoursModel {
    constructor() {
        this.courses = [];
    }


    setCourses(courses) {
        this.courses = courses;
    }


    clear() {
        this.courses = [];
    }
}



class CoursControler {
    constructor(model, view) {
        this.model = model;
        this.view = view;
        this.loadCourse = this.loadCourse;
    }


    handle() {
        this.loadCourse();
        setInterval(this.loadCourse, 3600000);
    }


    loadCourse() {
        this.model.clear();
        fetch('https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5')
            .then(res => res.json())
            .then(result => {
                this.model.setCourses(result);
            })
            .catch(err => {
                console.log(err);
            })
            .finally(() => {
                if(this.model.courses.length === 0) return this.view.courseError('Нет данных');
                let item = this.model.courses[0];
                this.view.renderCours(item.ccy, item.base_ccy, item.buy, item.sale);
                
                this.view.courseWidget.addEventListener('click', function(e) {
                    this.view.clearCourse();
                    if (e.target.className == 'usd') {
                        let item = this.model.courses[0]
                        this.view.renderCours(item.ccy, item.base_ccy, item.buy, item.sale);
                    }
                    else if (e.target.className =='euro') {
                        let item = this.model.courses[1]
                        this.view.renderCours(item.ccy, item.base_ccy, item.buy, item.sale);
                    }
                    else if (e.target.className =='rur') {
                        let item = this.model.courses[2]
                        this.view.renderCours(item.ccy, item.base_ccy, item.buy, item.sale);
                    }
                    else if (e.target.className =='btc') {
                        let item = this.model.courses[3]
                        this.view.renderCours(item.ccy, item.base_ccy, item.buy, item.sale);
                    }
                }.bind(this))
            });
    }

}


const coursView = new CoursView();
const coursModel = new CoursModel();
const coursController = new CoursControler(coursModel, coursView);

coursController.handle();

рони 16.01.2021 00:18

Цитата:

Сообщение от seven8959
e.target.className == '.usd'

:(
Цитата:

если что-то повторяется значит это можно сократить
не бывает точек и есть classList.contains

seven8959 16.01.2021 00:37

Огромное вам спасибо. Буду медитировать)))


Часовой пояс GMT +3, время: 21:46.