21.10.2019, 00:40
|
Новичок на форуме
|
|
Регистрация: 19.10.2019
Сообщений: 6
|
|
ограничение ввода 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>
но также никакого эффекта...
|
|
21.10.2019, 05:19
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Ruru
|
екоторые ячейки открываются для ввода
|
contentEditable?
<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, 21.10.2019 в 07:24.
|
|
21.10.2019, 14:03
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
laimas, иногда можно вводить, а иногда не можно, если нажимать мышкой!
Притом только с клавиатуры вообще нельзя вводить! (ЕЩЁ притом, если сначала нажимать мышкой, то потом можно вводить только с клавиатуры в те ячейки, на которые нажимали мышкой)
Если нажать мышкой так, чтобы каретка появилась после цифры в таблице, и нажать на число на клавиатуре, то число не вводится, а каретка перескакивает в начало ввода!
Если вставить или перетащить текст, то из него удаляется первый не цифровой символ, а остальное вставляется как есть! Тоже самое происходит при голосовом вводе.
Если выделить ввод и ввести не цифру, то всё исчезнет!
Последний раз редактировалось Malleys, 21.10.2019 в 14:09.
Причина: Добавил ещё
|
|
21.10.2019, 14:20
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Malleys,
естественно, ибо
если заниматься позицией курсора, то так просто не получится,
если еще и копирование учитывать, то нужно обрабатывать и это событие,
если не цифровой ввод анализировать "а чем?", то надо определить чем менять,
и прочие возможные если.
А пример все лишь отвечает на вопрос, что у td нет и не может быть никакого maxLength, который бы сам по себе на что-то влиял.
|
|
21.10.2019, 14:32
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от laimas
|
никакого maxLength,
|
Конечно нет, речь о вашем решении.
Сообщение от laimas
|
если заниматься позицией курсора, то так просто не получится,
если еще и копирование учитывать, то нужно обрабатывать и это событие,
если не цифровой ввод анализировать "а чем?", то надо определить чем менять,
|
Для этого подходит событие input, которое вы обрабатываете.
Сообщение от laimas
|
если заниматься позицией курсора, то так просто не получится,
|
Вам это не нужно, поскольку
Сообщение от Ruru
|
мне нужно чтобы туда можно было ввести только 1 цифру с 1 до 9.
|
Я так понимаю, любым способом!
<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, любое иное нажатие не должно менять исходный ввод, так ведь?
Последний раз редактировалось Malleys, 21.10.2019 в 14:35.
|
|
21.10.2019, 14:42
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Malleys
|
любое иное нажатие не должно менять исходный ввод, так ведь?
|
Вы меня об этом спрашиваете? Я даже не знаю что вообще находится в ячейках по умолчанию, это не ко мне вопрос.
|
|
21.10.2019, 14:45
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от laimas
|
Я даже не знаю что вообще находится в ячейках по умолчанию, это не ко мне вопрос.
|
По сути должно ничего или цифра от 1 до 9. Однако, чтобы там не находилось, оно не должно сломаться, а вводиться должны только цифры от 1 до 9!
|
|
21.10.2019, 14:58
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Malleys
|
По сути должно ничего или цифра от 1 до 9
|
Ну и на что менять не цифру, если ее нет, как просто не удаляя? Контактируйте с "заказчиком" о всех деталях, я не в курсе их. О курсоре, пойдет ли игнорирование его позиции (у вас это тоже) или нет и о прочем. Мне в общем все равно, не мне же нужно это.
|
|
21.10.2019, 16:08
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от laimas
|
цифру, если ее нет, как просто не удаляя?
|
Ничего не трогать! Ведь если предполагается ввод от 1 до 9, то любые другие клавиши ведут себя так, как будто их не нажимали!
Сообщение от laimas
|
игнорирование его позиции (у вас это тоже)
|
А какая разница, где стоит каретка, если самое большое можно ввести один символ! Нужно, чтобы произошёл ввод, а у вас он не происходит!
Сообщение от laimas
|
не мне же нужно это.
|
Для кого тогда ваш пример? Чему мы можем научится из вашего примера?
|
|
21.10.2019, 16:22
|
Новичок на форуме
|
|
Регистрация: 19.10.2019
Сообщений: 6
|
|
Вы как то усложнили до небес. Это судоку, часть ячеейк заполнена автоматически (их нельзя изменять) часть нет. Там где не заполнены нам нужно написать число от 1 до 9, при попытке нажать что то еще или букву просто ничего не произойдет. На данный момент я в пустую ячейку судоку могу хоть целый роман написать. Вот и спрашиваю как ограничить...
|
|
|
|