Пытаюсь добиться, чтобы при нажатии на область psewdophoto нажимался input , который внутри него, но браузер выдает ошибку в консоли(вроде, как я понимаю, зацикливание):
Uncaught RangeError: Maximum call stack size exceeded
HTML
<ul>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
</ul>
Javascript
$('.psewdophoto').click(function(event){
$(this).children('.post_photo').click();
event.preventDefault();
});
Проблема во всплытии события click. Вызывая click у дочернего элемента в обработчике клика родителя, при всплытии ты опять попадаешь в обработчик родительского элемента и все по новой.
Если вывести event.target можно заметить, что всегда выводится input.
var i = 0;
$('.psewdophoto').click(function(event) {
if (i++ < 5) {
$(this).children('.post_photo').click();
console.log(event.target);
}
event.preventDefault();
});
li {
border: solid 1px green;
}
input {
border: solid 1px red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
</ul>
Для решения можно добавить обработчик для input в котором запретить всплытие с помощью .stopPropagation()
$('.psewdophoto').click(function(event) {
$(this).children('.post_photo').click();
event.preventDefault();
});
$('input').click(function(e) {
e.stopPropagation();
});
li {
border: solid 1px green;
}
input {
border: solid 1px red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
</ul>
При клике на элементе также срабатывает событие и на родителе, об этом следует не забывать.
$('.psewdophoto').click(function(event){
$(this).children('.post_photo').click((function(e) {
e.stopImmediatePropagation();
})
);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
<li class="psewdophoto">
<input type="file" class="post_photo">
</li>
</ul>
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости