ограничение ввода Maxlength
Подскажите пожалуйста, у меня есть таблица, некоторые ячейки открываются для ввода (рандомно), мне нужно чтобы туда можно было ввести только 1 цифру с 1 до 9.
Желательно сделать это через JS. Я пробовала пройти по нужным мне ячейкам в джаве и сделать: tbl.rows[i].cells[j].maxLength='1'; но это не работает. пробовала в самой таблице в html сделать: <tr> <td id='c0'class="my-td"maxLength='1'></td> <td id='c1'class="my-td"maxLength='1'></td> <td id='c2'class="my-td"maxLength='1'></td> </tr> но также никакого эффекта... |
Цитата:
<style> table { border-collapse: collapse; } td { border: 1px solid #ddd; padding: 6px; } </style> <table> <tr><td>1</td><td>2</td><td>3</td></tr> <tr><td>4</td><td>5</td><td>6</td></tr> <tr><td>7</td><td>8</td><td>9</td></tr> </table> <script> var tbl = document.querySelector('table'); tbl.addEventListener('mousedown', function(e) { e.target.contentEditable = e.target.contentEditable=="inherit" || e.target.contentEditable=="false" ? true : false }); tbl.addEventListener('input', function(e) { e.target.textContent = e.target.textContent.replace(/\D|0/,'').replace(/(\d)\d+/,'$1') }); </script> |
laimas, иногда можно вводить, а иногда не можно, если нажимать мышкой!
Притом только с клавиатуры вообще нельзя вводить! (ЕЩЁ притом, если сначала нажимать мышкой, то потом можно вводить только с клавиатуры в те ячейки, на которые нажимали мышкой) Если нажать мышкой так, чтобы каретка появилась после цифры в таблице, и нажать на число на клавиатуре, то число не вводится, а каретка перескакивает в начало ввода! Если вставить или перетащить текст, то из него удаляется первый не цифровой символ, а остальное вставляется как есть! Тоже самое происходит при голосовом вводе. Если выделить ввод и ввести не цифру, то всё исчезнет! |
Malleys,
естественно, ибо если заниматься позицией курсора, то так просто не получится, если еще и копирование учитывать, то нужно обрабатывать и это событие, если не цифровой ввод анализировать "а чем?", то надо определить чем менять, и прочие возможные если. А пример все лишь отвечает на вопрос, что у td нет и не может быть никакого maxLength, который бы сам по себе на что-то влиял. |
Цитата:
Цитата:
Цитата:
Цитата:
<style> table { border-collapse: collapse; } td { border: 1px solid #ddd; padding: 6px; } </style> <table> <tr><td>1</td><td>2</td><td>3</td></tr> <tr><td>4</td><td>5</td><td>6</td></tr> <tr><td>7</td><td>8</td><td>9</td></tr> </table> <script> const table = document.querySelector("table"); for(const cell of table.querySelectorAll("td, th")) { cell.tabIndex = 0; cell.contentEditable = true; cell.dataset.value = cell.textContent; } table.addEventListener("input", ({ target }) => { let value = target.textContent.replace(target.dataset.value, ""); value = value || target.textContent; value = value.replace(/[^1-9]/g, "").slice(0, 1) || target.dataset.value; target.textContent = target.dataset.value = value; }); </script> laimas, любое иное нажатие не должно менять исходный ввод, так ведь? |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Вы как то усложнили до небес. Это судоку, часть ячеейк заполнена автоматически (их нельзя изменять) часть нет. Там где не заполнены нам нужно написать число от 1 до 9, при попытке нажать что то еще или букву просто ничего не произойдет. На данный момент я в пустую ячейку судоку могу хоть целый роман написать. Вот и спрашиваю как ограничить...
|
Цитата:
<style> table { border-collapse: collapse; } td { border: 1px solid #ddd; padding: 6px; min-width: 16px; text-align: center; } td[contenteditable] { box-shadow: inset 0 0 100px aliceblue; } </style> <table> <tr><td>1</td><td>2</td><td></td></tr> <tr><td>4</td><td></td><td>6</td></tr> <tr><td></td><td></td><td>9</td></tr> </table> <script> for(const cell of document.querySelectorAll("td:empty")) { cell.tabIndex = 0; cell.contentEditable = true; cell.dataset.value = cell.textContent; } document.addEventListener("input", ({ target }) => { let value = target.textContent.replace(target.dataset.value, ""); value = value || target.textContent; value = value.replace(/[^1-9]/g, "").slice(0, 1) || target.dataset.value; value = target.textContent === "" ? "" : value; target.textContent = target.dataset.value = value; }); </script> ЕЩЁ Добавил пример стиля для редактируемой ячейки. |
Спасибо!
*позже еще вариант нашла: let editable = document.querySelectorAll('td[contenteditable="true"]'); editable.forEach(e => { e.oninput = function() { this.innerText = this.innerText.replace(/[^\d]/, '').substring(0, 1); // ограничиваем длину и разрешаем только цифры } }); |
Часовой пояс GMT +3, время: 16:12. |