Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Поле для ввода HEX с границами диапазона, динамически меняющимися от выбора <select> (https://javascript.ru/forum/dom-window/75688-pole-dlya-vvoda-hex-s-granicami-diapazona-dinamicheski-menyayushhimisya-ot-vybora-select.html)

brp80000 30.10.2018 00:38

Поле для ввода HEX с границами диапазона, динамически меняющимися от выбора <select>
 
<style>
.max1:invalid {
color: red }
.max1:valid {
color: black;} </style>

Есть вот такой select
<select name ="CanFrame_Type" id="CanFrame_Type">
<option value="Std">Std</option>
<option value="Ext">Ext</option>
</select>
Далее поле для ввода НЕХ
<input id="Can_ID" name="Can_ID" size="5" class="max1" pattern="[A-F\d]{1,5}" />

когда выбрано Std должен быть доступен диапазон 0x0-0x7FF
а когда Ext то 0x800-0xFFFFFFFF. Соответственно желательно ещё и менять количество доступных символов для ввода Std {1,3} а при Ext {3,8}

Paguo-86PK 30.10.2018 06:50

<style>
.max1:invalid {
    color: red }
.max1:valid {
    color: black;}</style>
<body>
<select name="CanFrame_Type" id="CanFrame_Type" onchange='document.getElementById("Can_ID").pattern=this.value'>
<option value="[0-7][A-F\d]{2}|[A-F\d]{1,2}">Std</option>
<option value="[8-9A-F][A-F\d]{2}|[A-F\D]{4,8}">Ext</option>
</select>
<input id="Can_ID" name="Can_ID" size="5" class="max1" pattern="[A-F\d]{1,5}" />
</body>

SuperZen 30.10.2018 08:37

javascript вариант,
<style>
  .invalid {
    color: red
  }
</style>

Есть вот такой select
<select name="CanFrame_Type" id="CanFrame_Type">
  <option value="Std" data-min-max="0-7FF">Std</option>
  <option value="Ext" data-min-max="800-FFFFFFFF">Ext</option>
</select>
Далее поле для ввода НЕХ
<input id="Can_ID" name="Can_ID" size="5" class="max1" />

<script>
  const select = document.getElementById('CanFrame_Type')
  const input = document.getElementById('Can_ID')
  const update = () => {
    var [min, max] = select.options[select.options.selectedIndex].dataset.minMax.split('-')
    var value = parseInt(input.value, 16)
    if (value.toString(16) === input.value.toLowerCase() && value >= parseInt(min, 16) && value <= parseInt(max, 16)) {
      input.classList.contains('invalid') && input.classList.remove('invalid')
    } else !isNaN(value) && !input.classList.contains('invalid') && input.classList.add('invalid')
  }
  select.addEventListener('change', update)
  input.addEventListener('input', update)
</script>

brp80000 30.10.2018 10:49

SuperZen,
Спасибо отлично работает. Огромное спасибо

brp80000 01.11.2018 06:23

SuperZen,
а можно как то до внедрить сюда ограничение по количеству вводимых символов для ввода Std {1,3} а при Ext {3,8}

SuperZen 01.11.2018 12:39

brp80000, не понятно, как должно вести себя при {3,8}, например, для 0004...

<style>
  .invalid {
    color: red
  }
</style>

Есть вот такой select
<select name="CanFrame_Type" id="CanFrame_Type">
  <option value="Std" data-min-max="0-7FF" data-len-min-max="1-3">Std</option>
  <option value="Ext" data-min-max="800-FFFFFFFF" data-len-min-max="3-8">Ext</option>
</select>
Далее поле для ввода НЕХ
<input id="Can_ID" name="Can_ID" class="max1" />

<script>
  const select = document.getElementById('CanFrame_Type')
  const hex = document.getElementById('Can_ID')
  const update = (e) => {
    var [min, max] = select.options[select.options.selectedIndex].dataset.minMax.split('-')
    var [lmin, lmax] = select.options[select.options.selectedIndex].dataset.lenMinMax.split('-')
    var lvalid = hex.value.toString(16).length >= lmin && hex.value.toString(16).length <= lmax
    if (!lvalid && !hex.value.toString(16).length <= lmax) {
      hex.value = hex.value.substr(0, lmax)
    }
    var value = parseInt(hex.value, 16)
    if (value.toString(16) === hex.value.toLowerCase() && value >= parseInt(min, 16) && value <= parseInt(max, 16)) {
      hex.classList.contains('invalid') && hex.classList.remove('invalid')
    } else !isNaN(value) && !hex.classList.contains('invalid') && hex.classList.add('invalid')
  }
  select.addEventListener('change', update)
  hex.addEventListener('input', update)
</script>

brp80000 01.11.2018 17:17

Std 1-3 символа 0-7FF
Ext 3-5 символа 800-7FFFF
Что то никак не работает ... где ошибка?

<style>
.max1:invalid {
    font-weight: Bold;
    margin-top: 5px;
	margin-bottom: 5px; 
    color: red }
.max1:valid {
    font-weight: Bold;
    margin-top: 5px;
	margin-bottom: 5px; 
    color: black;} 
</style>

<form>
<div>
	<select name ="CanFrame" id="CanFrame">
	<option value="Std" data-min-max="0-7FF" data-len-min-max="1-3">Std</option>
	<option value="Ext" data-min-max="800-7FFFF" data-len-min-max="3-5">Ext</option>
	</select>
	<div>
	<input id="CanID" name="CanID" class="max1" size="5" pattern="[A-F\d]"/>
	</div>
</div>
</form>

<script>
const select = document.getElementById('CanFrame')
const hex = document.getElementById('CanID')
const update = (e) => {
var [min, max] = select.options[select.options.selectedIndex].dataset.minMax.split('-')
var [lmin, lmax] = select.options[select.options.selectedIndex].dataset.lenMinMax.split('-')
var lvalid = hex.value.toString(16).length >= lmin && hex.value.toString(16).length <= lmax
if (!lvalid && !hex.value.toString(16).length <= lmax) {
hex.value = hex.value.substr(0, lmax)
}
var value = parseInt(hex.value, 16)
if (value.toString(16) === hex.value.toLowerCase() && value >= parseInt(min, 16) && value <= parseInt(max, 16)) {
hex.classList.contains('invalid') && hex.classList.remove('invalid')
} else !isNaN(value) && !hex.classList.contains('invalid') && hex.classList.add('invalid')
}
select.addEventListener('change', update)
hex.addEventListener('input', update)
CanID.value = 400;
</script>

SuperZen 01.11.2018 17:26

brp80000,
Ext 3-5 символа 800-7FFFF
Что то никак не работает ... где ошибка?

если для этого случая вводить 00044 то условие 800 не сработает, а так кто вводит что-то должен понимать )

brp80000 01.11.2018 17:39

Да вообще что то код не работает, то ли со стилями ошибка?

SuperZen 01.11.2018 18:24

у меня в коде не смотрю на паттерн и размер
<input id="CanID" name="CanID" class="max1" size="5" pattern="[A-F\d]"/>
и стили тоже не так назначаются, если инпут не в размере, то обрезается под выбранный размер с правой стороны на максимальную длину, и если строка не входит в пределы, то интупу назначается класс invalid, а в твоем примере значение назначается через псевдо класс :invalid, надо тогда сделать
<input id="CanID" name="CanID" class="max1"/>
и
<style>
  .max1.invalid {
    font-weight: Bold;
    margin-top: 5px;
    margin-bottom: 5px;
    color: red
  }

  .max1 {
    font-weight: Bold;
    margin-top: 5px;
    margin-bottom: 5px;
    color: black;
  }
</style>


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