#javascript #html
#javascript #HTML
Вопрос:
это мой код:
function newTodo() {
const text = prompt('What needs to be done?').trim();
if (!!text) {
id = 1;
const todoId = 'todo' id;
// checkbox
const todoCheckbox = document.createElement('input');
todoCheckbox.type = 'checkbox';
todoCheckbox.id = todoId;
todoCheckbox.classname = classNames.TODO_CHECKBOX;
todoCheckbox.setAttribute('onclick', `handleCheck(${todoId})`);
...
} else {
alert('Please enter a valid todo');
}
}
function handleCheck(todoId) {
console.log('checked!', todoId);
}
но handleClick регистрирует html-элемент, к которому прикреплена функция:
<input type="checkbox" id="todo2" onclick="handleCheck(todo2)">
Я хотел зарегистрировать только идентификатор, поэтому я ожидаю, что это будет:
todo2
что я делаю не так?
Комментарии:
1.
handleClick
ты имеешь в видуhandleCheck
?2. не уверен, что вы передаете своей функции строку. попробуйте заключить ее в одинарные кавычки
<input type="checkbox" id="todo2" onclick="handleCheck('todo2')">
Ответ №1:
Ваш обработчик:
onclick="handleCheck(todo2)"
пытается сослаться на глобальную переменную с именем «todo2» и передать ее handleCheck
функции. Поскольку (что приводит к путанице) идентификаторы элементов автоматически добавляются к глобальному объекту, это приводит к передаче функции только что созданного вами элемента.
Вместо этого заключите todoId
в кавычки, чтобы убедиться, что она передается в виде строки:
todoCheckbox.setAttribute('onclick', `handleCheck('${todoId}')`);
Но было бы значительно элегантнее добавить обработчик должным образом, используя Javascript вместо встроенного атрибута HTML:
todoCheckbox.onclick = () => handleCheck(todoId);
Однако динамические идентификаторы — это запах кода — они редко бывают необходимы. Если вам нужны уникальные данные для каждого элемента, вы можете рассмотреть возможность использования data-
атрибутов или Map
.
Ответ №2:
Это должно быть <input type="checkbox" id="todo2" onchange="handleCheck(todo2)">