#javascript #html #checkbox #textfield
#javascript #HTML #флажок #текстовое поле
Вопрос:
Я создал форму, которая содержит флажок и небольшое поле ввода. Я создал скрипт для выполнения двух вещей:
- Если флажок установлен, а внутри текстового поля нет значения, вставьте название флажка в соответствующее текстовое поле.
- Если пользователь вводит текстовое поле, а флажок для соответствующего флажка не установлен, проверьте это.
- Если пользователь очищает текстовое поле, нажимая delete / backspace / etc, снимите флажок с флажка.
Что НЕ работает: * Когда пользователь вводит текстовое поле, флажок не появляется сразу (обычно 2 клавиши вводятся отдельно), хотя логика говорит, что при вызове, если флажок снят, установите его. * Когда пользователь очищает текстовую область, используя backspace / delete / etc., флажок остается.
Что работает:
- Пользователь нажимает на флажок, чтобы автоматически вставить значение флажка в поле. Пользователь снова нажимает на флажок, чтобы удалить значение из текстового поля.
Вот соответствующее кодирование, выполняемое в JSFiddle
function autocheck(ElementName, SectionName) {
//window.alert('keyword-' SectionName '-' ElementName.toLowerCase());
if (document.getElementById('keyword-' SectionName '-' ElementName.toLowerCase()).checked == false)
{
document.getElementById('keyword-' SectionName '-' ElementName.toLowerCase()).checked = true
}
if (document.getElementById('keyword-' SectionName '-entry-' ElementName.toLowerCase()).value == '')
{
document.getElementById('keyword-' SectionName '-' ElementName.toLowerCase()).checked = false;
}
}
function autofill(ElementName, SectionName) {
ElementName=ElementName.replace(" ", "-");
//window.alert('You got this: ' ElementName);
if(document.getElementById('keyword-' SectionName '-' ElementName.toLowerCase()).checked == true)
{
document.getElementById('keyword-' SectionName '-entry-' ElementName.toLowerCase()).value = document.getElementById('keyword-' SectionName '-' ElementName.toLowerCase()).value;
} else {
document.getElementById('keyword-' SectionName '-entry-' ElementName.toLowerCase()).value = '';
}
}
И вот соответствующий HTML
<input type="checkbox" name="ufs_split_keywords[]" value="Throw" id="keyword-split-throw" onclick="autofill(this.value, 'split');"> <label for="keyword-split-throw">Throw</label>
<br>
<input type="text" name="ufs_split_keywords_entry[]" id="keyword-split-entry-throw" style="width:100px; float: right;" onkeydown="autocheck('throw', 'split');">
Ответ №1:
Используйте onkeyup вместо onkeydown!
Поскольку вы только тогда получите измененное значение поля.
В момент времени события keydown значение входных данных будет старым / неизменным.
Помните об основном жизненном цикле нажатия клавиш на входных данных:
- нажатие клавиши — всплывающее событие
- применение keyevent при вводе (в основном запись в нем или удаление из него)
также может применяться несколько раз, когда пользователь удерживает ключ - нажатие клавиши- всплывающее событие
Эта скрипка работает для меня идеально. (Ваш код, содержащий только onkeydown, изменен на onkeyup)
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function autocheck(ElementName, SectionName) {
//window.alert('keyword-' SectionName '-' ElementName.toLowerCase());
if (document.getElementById('keyword-' SectionName '-' ElementName.toLowerCase()).checked == false)
{
document.getElementById('keyword-' SectionName '-' ElementName.toLowerCase()).checked = true
}
if (document.getElementById('keyword-' SectionName '-entry-' ElementName.toLowerCase()).value == '')
{
document.getElementById('keyword-' SectionName '-' ElementName.toLowerCase()).checked = false;
}
}
function autofill(ElementName, SectionName) {
ElementName=ElementName.replace(" ", "-");
//window.alert('You got this: ' ElementName);
if(document.getElementById('keyword-' SectionName '-' ElementName.toLowerCase()).checked == true)
{
document.getElementById('keyword-' SectionName '-entry-' ElementName.toLowerCase()).value = document.getElementById('keyword-' SectionName '-' ElementName.toLowerCase()).value;
} else {
document.getElementById('keyword-' SectionName '-entry-' ElementName.toLowerCase()).value = '';
}
}
</script>
</head>
<body>
<input type="checkbox" name="ufs_split_keywords[]" value="Throw" id="keyword-split-throw" onclick="autofill(this.value, 'split');"> <label for="keyword-split-throw">Throw</label>
<br>
<input type="text" name="ufs_split_keywords_entry[]" id="keyword-split-entry-throw" style="width:100px; float: right;" onkeyup="autocheck('throw', 'split');">
</body>
</html>
Комментарии:
1. Да, это сработало отлично. Я не понял разницы между OnKeyUp и OnKeyDown. Я также добавил OnBlur на всякий случай, если пользователь выбирает все с помощью мыши, а затем использует опцию «Щелкнуть правой кнопкой мыши» -> «Удалить». В любом случае это работает. Спасибо.