Зависит от того, насколько конкретно вам нужно быть. В частности, ваш текущий:
event.target.className == "input-field"
не особенно гибок - это будет работать, только если элемент имеет , этот класс , input-field
и только этот класс. Что, если позже вы поймете, что хотите добавить другой класс к этому элементу, для стилизации или чего-то еще? Затем вышеуказанный тест не пройден, и вам придется вернуться и исправить его.
Этот же фрагмент кода работает независимо от того, содержит ли оператор if event.target.nodeName == "INPUT"
Это будет соответствовать любому input
полю на странице, что вполне может быть нежелательным - что, если дополнительный HTML, который вы добавите позже, окажется с <input>
, который вы не хотите запускать обработчик? Затем вам придется вернуться и исправить это.
event.target.dataset.field == "input"
Это приведет к запуску обработчика для любого элемента с data-field="input"
. Хотя, возможно, маловероятно, что если такой элемент будет добавлен в HTML позже, к которому вы не хотите, чтобы этот слушатель был подключен? Затем вам снова придется вернуться и исправить это.
Обычно рекомендуется указывать как можно более конкретным при нацеливании на элементы. Вы можете сделать это с помощью Element.prototype.matches
- передать ему строку селектора (строки селектора очень гибкие), и он вернет логическое значение, указывающее, соответствует ли строка селектора элементу:
if (event.target.matches('input.input-field[data-field="input"]')) {
callFunctionName();
}