Проблема в том, что событие, инициируемое на элементе input
, затем всплывает и обрабатывается на span
.Это происходит для исходного события и для события, которое вы запускаете программно.
Решение, вероятно, состоит в том, чтобы проверить, произошло ли событие в элементе input
, и не обрабатывать его, если оно произошло:
$('.RedHover').click(
function (e) {
if (e.target.nodeName.toLowerCase() !== 'input') {
$(this).children('input').trigger('click');
e.stopPropagation();
e.preventDefault();
console.log('here');
}
}
);
try/catch
не был необходим, jQuery гарантирует, что объект события всегда существует и имеет методы, которые вы используете.
Вызовы stopPropgation
и preventDefault
может быть ненужным, в зависимости от вашего ожидаемого поведения.
Поскольку у span
есть только один ребенок, вы можете сделать это по-другому.Если this
(элемент, где обрабатывается событие, всегда span
) совпадает с e.target
(элемент, из которого произошло событие, либо span
, либо input
), вы можете продолжить:
$('.RedHover').click(
function (e) {
if (this === e.target) {
$(this).children('input').trigger('click');
e.stopPropagation();
e.preventDefault();
console.log('here');
}
}
);
Обратите внимание, что это гораздо менее стабильно, чем проверка nodeName
: если вы измените свой HTML в будущем, он может сломать этот код.