Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функции Javascript (https://javascript.ru/forum/misc/80438-funkcii-javascript.html)

richlime 04.06.2020 20:46

Функции Javascript
 
Здравствуйте, учусь тут js и задался вопросом "в скрипте может использоваться только одна функция (function) или несколько?". Правильно ли я понимаю, что в скрипте может использоваться только одна функция, для другой нужно подключать еще один скрипт?

Вот для примера. У меня есть функция для того, чтобы выдавалось сообщение об ошибке, если не заполнено хотя бы одно
из трех полей («Сумма», «Срок» и «Ставка») и для проверки тех же самых полей для предотвращения ввода нечисловых данных. Есть еще одна функция для подсчета общей суммы вклада (Общая_Сумма =Сумма*(Ставка/100/12)*Срок.), но она почему-то не работает. Подскажите, пожалуйста, как ее исправить
1 функция (работает):
function checkform(){
var z = document.forms["bank"]["summ"].value;
	var a = document.forms["bank"]["srok"].value;
	var b = document.forms["bank"]["stavka"].value;	
	valid = true;
		if (document.bank.summ.value == "" || /\D/.test(z))
		{alert("Вы не заполнили поле Сумма или ввели буквы вместо цифр")
		valid=false;
		}
		else
		if (document.bank.srok.value == "" || /\D/.test(a))
		{alert("Вы не заполнили поле Срок или ввели буквы вместо цифр")
		valid=false;
		}
		  else if (document.bank.stavka.value == "" || /\D/.test(b))
		{alert("Вы не заполнили поле Ставка или ввели буквы вместо цифр")
		valid=false;
		}
		
		  return valid;
		  }


2 функция (не работает):
document.bank.onsubmit = function() {

    var result = (this.summ.value * (this.stavka.value/100/12) * this.srok.value);

    this.result.value = result.toFixed(2);

    return false;

}


И форма:
<form action="" method="post" name="bank" align="center"  style="color:#ED1302;" >
		<label for="Cумма">Сумма(руб.): </label>
		<input type="text" name="summ"  id="summ"/><br /><br />
		<label for="Срок">Срок(мес.): </label>
		<input type="text" name="srok" id="srok"/><br /><br />
		<label for="Cтавка">Ставка(%):</label>
		<input type="text" name="stavka"  id="stavka"/><br /><br />	
		<label for="Общая сумма">Общая сумма: </label>
		 <input type="text" name="result" readonly>
<br /><br />
		<input type="submit" name="submit" id="rezultat" value="Вычислить!"  />

	</form>

richlime 04.06.2020 21:20

В общем, из одного скрипта, перекинул в первый, скажем так, объединил.
Выводит результат, но теперь другая проблема. Как задержать результат? Он показывается на пол секунды и пропадает.
function checkform(){
var a=document.bank.summ.value;
var b=document.bank.srok.value;
var c=document.bank.stavka.value;
var t=a*(c/100/12)*b;
document.bank.result.value=t;
var z = document.forms["bank"]["summ"].value;
	var a = document.forms["bank"]["srok"].value;
	var b = document.forms["bank"]["stavka"].value;	
	valid = true;
		if (document.bank.summ.value == "" || /\D/.test(z))
		{alert("Вы не заполнили поле Сумма или ввели буквы вместо цифр")
		valid=false;
		}
		else
		if (document.bank.srok.value == "" || /\D/.test(a))
		{alert("Вы не заполнили поле Срок или ввели буквы вместо цифр")
		valid=false;
		}
		  else if (document.bank.stavka.value == "" || /\D/.test(b))
		{alert("Вы не заполнили поле Ставка или ввели буквы вместо цифр")
		valid=false;
		}
		document.bank.result.value=t;
		  return valid;
		  }

рони 04.06.2020 21:23

Цитата:

Сообщение от richlime
Правильно ли я понимаю, что в скрипте может использоваться только одна функция, для другой нужно подключать еще один скрипт?

в одном скрипте, сколько угодно функций.
richlime,
читать https://learn.javascript.ru/introduction-browser-events
переходить на addEventListener при назначении обработчиков с on...

рони 04.06.2020 21:26

Цитата:

Сообщение от richlime
Он показывается на пол секунды и пропадает

страница отправила данные и перешла на адрес action (так как пустой адрес, то перезагрузка на саму себя)

richlime 04.06.2020 21:27

и что делать?

рони 04.06.2020 21:34

richlime,
<!doctype html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
<style type="text/css">
[name="bank"] {
color:#ED1302;
text-align: center;
}

</style>
  <script>
document.addEventListener("DOMContentLoaded", function() {
    function checkform(event) {
        event.preventDefault(); //отмена отправки данных из формы
        var a = document.bank.summ.value;
        var b = document.bank.srok.value;
        var c = document.bank.stavka.value;
        var t = a * (c / 100 / 12) * b;
        document.bank.result.value = t;
        var z = document.forms["bank"]["summ"].value;
        var a = document.forms["bank"]["srok"].value;
        var b = document.forms["bank"]["stavka"].value;
        valid = true;
        if (document.bank.summ.value == "" || /\D/.test(z)) {
            alert("Вы не заполнили поле Сумма или ввели буквы вместо цифр")
            valid = false;
        } else
        if (document.bank.srok.value == "" || /\D/.test(a)) {
            alert("Вы не заполнили поле Срок или ввели буквы вместо цифр")
            valid = false;
        } else if (document.bank.stavka.value == "" || /\D/.test(b)) {
            alert("Вы не заполнили поле Ставка или ввели буквы вместо цифр")
            valid = false;
        }
        document.bank.result.value = t;
        return valid;
    }
    document.bank.addEventListener("submit", checkform)
});
  </script>
</head>
<body>
<form action="" method="post" name="bank">
		<label for="Cумма">Сумма(руб.): </label>
		<input type="text" name="summ"  id="summ"/><br /><br />
		<label for="Срок">Срок(мес.): </label>
		<input type="text" name="srok" id="srok"/><br /><br />
		<label for="Cтавка">Ставка(%):</label>
		<input type="text" name="stavka"  id="stavka"/><br /><br />
		<label for="Общая сумма">Общая сумма: </label>
		 <input type="text" name="result" readonly>
<br /><br />
		<input type="submit" name="submit" id="rezultat" value="Вычислить!"  />
	</form>
</body>
</html>

laimas 04.06.2020 21:34

Цитата:

Сообщение от richlime
в скрипте может использоваться только одна функция (function) или несколько?

Сколь угодно.

Не предполагается отправление формы? Тогда и кнопка submit не нужна, можно просто кнопкой вызывать расчет, причем проверку полей выполнять тут же, то есть все одной функцией.

<form id="bank">
....
<input type="button" id="rezultat" value="Вычислить!" />

document.getElementById('rezultat').addEventListener('click', calculate);

function calculate() {
    let fld = document.getElementById('bank').elements, error = [];
    
    [...fld].slice(0, 3).forEach((e) => {
        if(!e.value.trim() || /\D/.test(e.value)) error.push("Вы не заполнили поле "+e.previousElementSibling.getAttribute('for')+" или ввели буквы вместо цифр")
    });
    
    if(error.length) {
        alert(error.join('\n'));
        return;    
    }
    
    fld.result.value = (fld.summ.value * (fld.stavka.value/100/12) * fld.srok.value).toFixed(2)
}

richlime 04.06.2020 21:39

Спасибо) Уже разобрался
<form action="javascript:checkform()(this)" method="post" name="bank" align="center" onsubmit="return checkform(this)" style="color:#ED1302;" >
Вроде все работает)

richlime 04.06.2020 21:43

А еще, подскажите, пожалуйста, как с помощью атрибута disabled сделать так, чтобы кнопка "Вычислить" была неактивной, до того момента, пока все поля не будут заполнены?

laimas 04.06.2020 21:44

Выбрасывайте action="javascript:checkform()(this)" (это вообще ошибка), method="post", onsubmit="return checkform(this)", это не лучший подход, align="center", style="color:#ED1302;", это лучше стилями.

laimas 04.06.2020 21:47

Цитата:

Сообщение от richlime
чтобы кнопка "Вычислить" была неактивной

А чем же процесс запускать? Тогда нужно две кнопки, одна для проверки, вторая для вычисления, но к чему?

richlime 04.06.2020 21:53

Ну она должна быть не активной до того момента, пока не будут заполнены все поля

рони 04.06.2020 21:57

Цитата:

Сообщение от richlime
Ну она должна быть не активной до того момента, пока не будут заполнены все поля

напишите функцию которая вернёт true когда все поля заполнены.

laimas 04.06.2020 22:00

Цитата:

Сообщение от richlime
Ну она должна быть не активной до того момента

Тогда нужно установить обработчики полям формы, следящие за вводом в них и производящих проверку (можно делегировать форме), вот они и будут управлять доступностью кнопки. А сейчас то у вас одна кнопка запускающая процесс, как же вы его запустите, если она будет недоступна?

laimas 04.06.2020 23:44

Если на странице нужен просто калькулятор, форма не отправляется, то многое в ней что у вас просто лишнее. Здесь будем следить за вводом в полях, проверять ввод, и управлять доступностью кнопки.

Нужно обратить внимание на обрабатываемое событие (оно делегируется форме) input. О поддержке его можно прочесть здесь, следовательно и принимать решение - все норма или ... При обработке такого события вывод ошибок посредством alert будет просто раздражительным, поэтому будем выводить их на странице. Также сделаем не вывод ошибок во всех полях, а только для первого, в котором найдена ошибка. Также разобьем причину ошибки на два раздельных сообщения.

<form id="bank">
    <label>Сумма(руб.): </label>
    <input type="text" name="summ" /><br /><br />
    <label>Срок(мес.): </label>
    <input type="text" name="srok" /><br /><br />
    <label>Ставка(%):</label>
    <input type="text" name="stavka" /><br /><br />	
    <label>Общая сумма: </label>
    <input type="text" name="result" readonly /><br /><br />
    <input type="button" id="run" value="Вычислить!" disabled />
</form>

<p id="error"></p>

<script>

document.getElementById('bank').addEventListener('input', function() {
    let fld = this.elements, error = '';
        
    [...fld].slice(0, 3).some((e) => {
        if(!e.value || /\D/.test(e.value)) {
            let f = e.previousElementSibling.textContent.match(/.+(?=\()/);
            error = !e.value && `Заполните поле ${f}!` || `В поле ${f} разрешен ввод только цифр!`; 
            return true;
        }
    });
    
    document.getElementById('error').textContent = error; 
    fld.run.disabled = error;
});

document.getElementById('run').addEventListener('click', calculate);

function calculate() {
    this.form.result.value = (this.form.summ.value * (this.form.stavka.value/100/12) * this.form.srok.value).toFixed(2)
}
</script>

richlime 05.06.2020 00:00

спасибо)


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