Поле для ввода 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} |
<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>
|
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>
|
SuperZen,
Спасибо отлично работает. Огромное спасибо |
SuperZen,
а можно как то до внедрить сюда ограничение по количеству вводимых символов для ввода Std {1,3} а при Ext {3,8} |
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>
|
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>
|
brp80000,
Ext 3-5 символа 800-7FFFF Что то никак не работает ... где ошибка? если для этого случая вводить 00044 то условие 800 не сработает, а так кто вводит что-то должен понимать ) |
Да вообще что то код не работает, то ли со стилями ошибка?
|
у меня в коде не смотрю на паттерн и размер
<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>
|
Ага, вроде заработало
|
А как исключить ввод строчных английских символов?
да и исключить все символы кроме допустимых для HEX почему то pattern="[A-F\d]" не отрабатывает? |
казалось бы простая задача на словах )...
<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>
function HEX(s, h) {
const select = document.getElementById(s)
const hex = document.getElementById(h)
function update() {
!(parseInt(hex.value, 16).toString(16) === hex.value.toLowerCase()) && !!hex.value && (hex.value = hex.oldValue || '')
var [min, max] = select.options[select.options.selectedIndex].dataset.minMax.split('-')
var [lmin, lmax] = select.options[select.options.selectedIndex].dataset.lenMinMax.split('-')
!(hex.value.toString(16).length <= lmax) && (hex.value = hex.oldValue || '')
parseInt(hex.value, 16) >= parseInt(min, 16) && parseInt(hex.value, 16) <= parseInt(max, 16) ?
hex.classList.contains('invalid') && hex.classList.remove('invalid')
:
!hex.classList.contains('invalid') && hex.classList.add('invalid')
hex.oldValue = hex.value
}
select.addEventListener('change', update)
hex.addEventListener('input', update)
update()
}
const controller = new HEX('CanFrame_Type', 'Can_ID')
</script>
|
Маленькие латинские ABCDEF всё равно воспринимает, но подумав я понял что и так хорошо. СПАСИБО
Кстати тестил на старом айфоне, там скрипт не работает(( подскажите как указать атрибут download через JS
<a id="LastLog1"></a>
<script>
var LastLog_r = "3";
LastLog1.href = "logs/lam"+(LastLog_r-2)+".log";
LastLog1.textContent = "lam"+(LastLog_r-2)+".log";
//LastLog1.setAttribute('download','download');
</script>
Чтобы по нажатию происходило скачивание |
Цитата:
<a id="lastLog">download</a><script>
lastLog.href = URL.createObjectURL(new Blob(["ваши данные для скачивания"], { type: "text/plain" }));
lastLog.download = "lam.log";
</script>
UPD Вот ещё вариант поля для ввода HEX с границами диапазона, динамически меняющимися от выбора <select>
<style>
html { font: 120% monospace }
select, input { font: inherit }
.invalid { color: red }
</style>
Есть вот такой select
<select name="CanFrame_Type" id="CanFrame_Type">
<option value="0-7FF">Std</option>
<option value="800-FFFFFFFF">Ext</option>
</select>
и поле для ввода НЕХ
<input id="Can_ID" name="Can_ID" class="max1">
<script>
function HEX(...ids) {
const [select, hex] = ids.map(id => document.getElementById(id));
function update() {
const [valid, value] = select.value
.split("-")
.map(v => [parseInt(v, 16), v.length])
.reduce(([min], [max, maxLength]) => {
const value = hex.value.replace(/[^\da-f]/gi, "").slice(0, maxLength);
const number = parseInt(value, 16);
return [
min <= number && number <= max,
value
]
});
hex.classList.toggle("invalid", !valid);
hex.value = value;
}
addEventListener("input", ({ target }) => [select, hex].includes(target) && update());
update();
}
new HEX("CanFrame_Type", "Can_ID");
</script>
UPD2 Цитата:
UPD3 Цитата:
<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script> |
Как исключить все символы кроме допустимых для HEX. Тут можно что угодно вводить !"№;sgфф?
|
Цитата:
|
Цитата:
файл открывается браузером, но не скачивается |
Конкретно ваш вариант не устанавливает атрибут download(он был закомментирован)
<a id="LastLog1"></a>
<script>
var LastLog_r = "3";
LastLog1.href = "logs/lam"+(LastLog_r-2)+".log";
LastLog1.textContent = "lam"+(LastLog_r-2)+".log";
LastLog1.setAttribute('download','download');
</script>
|
Цитата:
|
Цитата:
|
А почему не по прямой ссылке из списка файлов каталога?
|
Я храню последние три лога, при записи четвертого первый стирается и т.д.
Последний номер передается, тут для простоты var LastLog_r = "3"; Скрипт генерирует путь к файлу и его имя (правда (LastLog_r-2) получается = 1 ... но чую как то коряво получается). Файл просто открывается в браузере как текст, но не скачивается |
Вы же писали, что у вас сервер, а какой? Их в общем то используемых всего три - Apache, nginx, IIS. Сервер сам вполне может отдать список каталогов файлов, сформировав ссылки на них. Например Apache отдаст такую страницу:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html> <head> <title>Index of /doc</title> </head> <body> <h1>Index of /doc</h1> <table> <tr><th valign="top"><img src="/apacheicons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr> <tr><th colspan="5"><hr></th></tr> <tr><td valign="top"><img src="/apacheicons/back.gif" alt="[PARENTDIR]"></td><td><a href="/">Parent Directory</a></td><td> </td><td align="right"> - </td><td> </td></tr> <tr><td valign="top"><img src="/apacheicons/layout.gif" alt="[ ]"></td><td><a href="1.log">1.log</a></td><td align="right">2012-06-23 21:03 </td><td align="right">9.9K</td><td> </td></tr> <tr><td valign="top"><img src="/apacheicons/layout.gif" alt="[ ]"></td><td><a href="2.log">2.log</a></td><td align="right">2012-06-23 21:03 </td><td align="right"> 26K</td><td> </td></tr> <tr><td valign="top"><img src="/apacheicons/layout.gif" alt="[ ]"></td><td><a href="3.log">3.log</a></td><td align="right">2012-06-23 21:03 </td><td align="right"> 53K</td><td> </td></tr> <tr><th colspan="5"><hr></th></tr> </table> </body></html> Такую страницу сервер отдает только в случае, если каталог не закрыт для внешнего доступа, в нем не запрещен листинг файлов посредством .htaccess или в нем нет индексного файла с пустым содержимым. |
| Часовой пояс GMT +3, время: 11:39. |