Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как правильно повесить функцию на событие? (https://javascript.ru/forum/misc/76353-kak-pravilno-povesit-funkciyu-na-sobytie.html)

CryNet 02.01.2019 23:51

Как правильно повесить функцию на событие?
 
Необходимо повесить функцию на событие onchange на input, но только если у input-а класс menu.
Часть HTML:
...
<p><input type="checkbox" checked data-cost="20" data-kkal="200" class="menu">Котлета</p>
...

Весь JS:
onchange = function getResult(){
    var menu = document.getElementsByClassName('menu');
    var cost = 0;
    var kkal = 0;
    for (let index = 0; index < menu.length; index++) {
        if(menu[index].checked) {
            cost += parseFloat(menu[index].getAttribute('data-cost'));
            kkal += parseFloat(menu[index].getAttribute('data-kkal'));
        }
    }
    document.getElementById('cost').innerHTML = cost;
    document.getElementById('kkal').innerHTML = kkal;
}

рони 03.01.2019 00:01

CryNet,
document.addEventListener('DOMContentLoaded', function() {
var menu = document.getElementsByClassName('menu');
for (var i = 0; i < menu.length; i++) {
    menu[i].addEventListener('change', getResult)
}

function getResult(){
    var cost = 0;
    var kkal = 0;
    for (let index = 0; index < menu.length; index++) {
        if(menu[index].checked) {
            cost += parseFloat(menu[index].getAttribute('data-cost'));
            kkal += parseFloat(menu[index].getAttribute('data-kkal'));
        }
    }
    document.getElementById('cost').innerHTML = cost;
    document.getElementById('kkal').innerHTML = kkal;
}
});

CryNet 03.01.2019 00:27

О, спасибо. Ещё один маленький вопрос
У меня есть уже выбранные input-ы:
<p><input type="checkbox" checked disabled data-cost="10" data-kkal="75" class="menu">Булочка</p>

Как сделать, чтобы при загрузке страницы уже отображалось значение выбранных input-ов? Раньше была немного другая конструкция функции:
function getResult(){
    var menu = document.getElementsByClassName('menu');
    var cost = 0;
    var kkal = 0;
    for (let index = 0; index < menu.length; index++) {
        if(menu[index].checked) {
            cost += parseFloat(menu[index].getAttribute('data-cost'));
            kkal += parseFloat(menu[index].getAttribute('data-kkal'));
        }
    }
    document.getElementById('cost').innerHTML = cost; // значение выводится тут
    document.getElementById('kkal').innerHTML = kkal;// и здесь
}

getResult();

И достаточно было просто вызвать функцию. В вашей же реализации такое не прокатывает.

рони 03.01.2019 01:42

Цитата:

Сообщение от CryNet
В вашей же реализации такое не прокатывает.

:-?
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">

  <script>
document.addEventListener('DOMContentLoaded', function() {
var menu = document.getElementsByClassName('menu');
for (var i = 0; i < menu.length; i++) {
    menu[i].addEventListener('change', getResult)
}

function getResult(){
    var cost = 0;
    var kkal = 0;
    for (let index = 0; index < menu.length; index++) {
        if(menu[index].checked) {
            cost += parseFloat(menu[index].getAttribute('data-cost'));
            kkal += parseFloat(menu[index].getAttribute('data-kkal'));
        }
    }
    document.getElementById('cost').innerHTML = cost;
    document.getElementById('kkal').innerHTML = kkal;
}
getResult();
});
  </script>
</head>

<body>
<div id="cost"></div>
<div id="kkal"></div>
<p><input type="checkbox" checked disabled data-cost="10" data-kkal="75" class="menu">Булочка</p>
<p><input type="checkbox" checked disabled data-cost="10" data-kkal="75" class="menu">Булочка</p>
<p><input type="checkbox" checked disabled data-cost="10" data-kkal="75" class="menu">Булочка</p>
</body>
</html>

рони 03.01.2019 01:46

CryNet,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">

  <script>
document.addEventListener('DOMContentLoaded', function() {
var menu = document.getElementsByClassName('menu');
for (var i = 0; i < menu.length; i++) {
    menu[i].addEventListener('change', getResult)
}

function getResult(){
    var cost = 0;
    var kkal = 0;
    for (var index = 0; index < menu.length; index++) {
        if(menu[index].checked) {
            cost += +menu[index].dataset.cost;
            kkal += +menu[index].dataset.kkal;
        }
    }
    document.getElementById('cost').innerHTML = cost;
    document.getElementById('kkal').innerHTML = kkal;
}
getResult();
});
  </script>
</head>

<body>
<div id="cost"></div>
<div id="kkal"></div>
<p><input type="checkbox" checked disabled data-cost="10" data-kkal="75" class="menu">Булочка</p>
<p><input type="checkbox" checked disabled data-cost="10" data-kkal="75" class="menu">Булочка</p>
<p><input type="checkbox" checked disabled data-cost="10" data-kkal="75" class="menu">Булочка</p>
</body>
</html>

CryNet 03.01.2019 01:58

А, я понял почему у меня не вышло. Спасибо :)


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