Принцип устройства конвертирования
Здравствуйте!
Покажите пожалуйста схему как делать конвертирование. Я видел что вводят unit с массивами значений (мне laimas как то помог), но я не смог уловить саму идею в контексте большого скрипта. Так как я делаю - это жесть. Поэтому прошу показать на упрощённом примере решение для таких задач: 1. Измерить удава (из 38 попугаев) 1 удав = 2 слонёнка = 5 мартышек = 38 попугаев. Макет: Удавов: <input type="number" name="animal"><br> Слонёнка: <input type="number" name="animal"><br> Мартышек: <input type="number" name="animal"><br> Попугаев: <input type="number" name="animal"><br> <script> let animals = document.querySelectorAll('input[name="animal"]'); animals.forEach(el => el.addEventListener('input', function () { })); </script> Ну а второй пример - классика жанра, единицы длины: 1000мм = 100см = 1м Макет: мм: <input type="number" name="unit"><br> см: <input type="number" name="unit"><br> м: <input type="number" name="unit"><br> <script> let unit = document.querySelectorAll('input[name="unit"]'); unit.forEach(el => el.addEventListener('input', function () { })); </script> Я макеты сделал минимальными, возможно нужно атрибуты какие добавить. Нужно чтобы при вводе значения в других инпутах показывало сколько это будет в их ед. измерения. Если не сложно, покажите пожалуйста решение. |
MC-XOBAHCK,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> </head> <body> мм: <input type="number" name="unit"><br> см: <input type="number" name="unit"><br> м: <input type="number" name="unit"><br> <script> let unit = document.querySelectorAll('input[name="unit"]'); const rang = [1000, 100, 1]; unit.forEach((el, i)=> (el.value = rang[i], el.addEventListener('input', function () { let val = el.value / rang[i]; unit.forEach((el, k)=>{ el.value = val * rang[k] }) }))); </script> </body> </html> |
MC-XOBAHCK,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> </head> <body> Удавов: <input type="number" name="animal"><br> Слонёнка: <input type="number" name="animal"><br> Мартышек: <input type="number" name="animal"><br> Попугаев: <input type="number" name="animal"><br> <script> let unit = document.querySelectorAll('input[name="animal"]'); const rang = [1, 2, 5, 38]; unit.forEach((el, i)=> (el.value = rang[i], el.addEventListener('input', function () { let val = el.value / rang[i]; unit.forEach((el, k)=>{ el.value = (val * rang[k] *100|0)/100 }) }))); </script> </body> </html> |
Цитата:
addEventListener("input", ({ target }) => { const relatedInputs = (target.form || document) .querySelectorAll(`input[type="number"][name="${event.target.name}"]`); const value = Number(target.value); const unit = Number(target.getAttribute("value")); for(const input of relatedInputs) { if(input === event.target) continue; input.value = value * Number(input.getAttribute("value")) / unit; } }); MC-XOBAHCK, это решение предполагает, что вы укажете в самих полях в атрибуте value пример конвертации. Если вы будете указывать отдельно в массиве, то вероятно запутаетесь и сделаете ошибку. Такая конвертация однотипна, один скрипт может обрабатывать всё поля. Может работать без формы, как указано у вас, но если нужны поля с одинаковыми именами, то можно обернуть в форму, чтобы изолировать друг от друга поля с одинаковыми именами. Вот пример целиком... <style> form { display: grid; grid-template-columns: 1fr 5fr; gap: 1em; text-align: right; margin: 1em; padding: 1em; max-width: 30em; } form > label { display: contents; } </style> <script> addEventListener("input", ({ target }) => { const relatedInputs = (target.form || document) .querySelectorAll(`input[type="number"][name="${event.target.name}"]`); const value = Number(target.value); const unit = Number(target.getAttribute("value")); for(const input of relatedInputs) { if(input === event.target) continue; input.value = value * Number(input.getAttribute("value")) / unit; } }); </script> <form> <label>мм: <input type="number" name="unit" value="1000"></label> <label>см: <input type="number" name="unit" value="100"></label> <label>м: <input type="number" name="unit" value="1"></label> </form> <form> <label>Удавов: <input type="number" name="animal" value="1"></label> <label>Слонёнка: <input type="number" name="animal" value="2"></label> <label>Мартышек: <input type="number" name="animal" value="5"></label> <label>Попугаев: <input type="number" name="animal" value="38"></label> </form> Можно с формой, а можно без формы. Форма позволяет изолировать друг от друга одноимённые поля. Удобно ведь таким образом? Указываешь в поле курсы валют, длины, объёмы, площади и всё остальное, что можно конвертировать, и оно работает! Вы понимаете, как можно добавить ещё один конвертер? UPD рони, вы всё-таки запутались в массивах и полях (потому что в двух разных местах) и у вас получается, что 1 м равен 10 см! Также при таком подходе поля сразу заполнены правильным примером, и у пользователя не складывается впечатление, что ему придётся заполнять все эти поля. Цитата:
|
Цитата:
Цитата:
|
рони, Спасибо! Именно то что я спрашивал.
Malleys, Спасибо! В ваших скриптах, как обычно, для меня есть что то новое, познавательное и очень полезное. В 10 строчках - для меня сразу 4 новинки. Закинул код в VSCode (привычная подсветка), посмотрел в доках MDN - всё просто и понятно. Большое спасибо за ваш пример! |
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
typeof input.getAttribute("value") == 'string' делается сразу типизация данных. У меня как то была проблема и я долго над ней просидел пока принудительно не типизировал значение в число. Для меня вот такой подход с конструктором Number - это приятная новинка, упрощающая жизнь: const value = Number(target.value); Признаюсь, я раньше так никогда не делал. Теперь для чисел только так буду парсить значения. |
Цитата:
Цитата:
const value = +target.value; const value = target.value * 1; |
Часовой пояс GMT +3, время: 18:30. |