Почему при клике на кастомную кнопку “Скачать” не происходит переход хотя JS-обработчик отрабатывает. Как решить?

Ссылка скопирована
1 ответ

По вводным: столкнулся со странным поведением при работе с кастомной кнопкой для скачивания.
По вводным: у меня есть элемент, который визуально выглядит как<button>, но реализован через<a>Со стилями.
Сейчас ситуация такая: при клике на десктопе всё работает, а на мобильных устройствах (Android Chrome) иногда не происходит переход — только после второго нажатия.
Проверял разные варианты:

<button onclick="window.location.href='example.com'">Скачать</button>

И

<a href="example.com" class="btn" onclick="return true;">Скачать</a>

По вводным: подозреваю, что дело в preventDefault() где-то выше по дереву или особенностях тач-событий.
По вводным: как правильно реализовать кликабельную “кнопку-ссылку”, которая:

  1. По вводным: работает на всех мобильных браузерах,
  2. Не теряет стили кнопки,
  3. Нужно понять: не блокируется JS-обработчиками событий родителя?
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Редакция по БД Ответ

Если обработчик клика срабатывает, а переход по кастомной кнопке на мобильном происходит только со второго нажатия, почти всегда проблема не в самом href, а в слое поверх ссылки, фокусе, hover-состоянии или конфликте между touchstart и click. На Android Chrome это часто проявляется, когда элемент выглядит как кнопка, но внутри или поверх него есть вложенный блок, псевдоэлемент, анимация или обработчик, который делает preventDefault().

Самый надёжный вариант: если это ссылка для скачивания, оставьте именно ссылку, а не кнопку с ручным переходом:

&lt;a class="download-button" href="/files/report.pdf" download&gt;Скачать&lt;/a&gt;

&lt;a class="download-button" href="/files/report.pdf" download&gt;Скачать&lt;/a&gt;

Если нужно выполнить аналитику перед переходом, не отменяйте действие ссылки. Лучше повесьте обработчик и дайте браузеру самому открыть адрес:

document.querySelectorAll('.download-button').forEach(function (link) {
  link.addEventListener('click', function () {
    if (window.ym) {
      ym(83328046, 'reachGoal', 'download_click');
    }
  });
});

document.querySelectorAll('.download-button').forEach(function (link) { link.addEventListener('click', function () { if (window.ym) { ym(83328046, 'reachGoal', 'download_click'); } }); });

Проверьте CSS. Частые причины второго клика:

  • псевдоэлемент ::before или ::after лежит поверх ссылки;
  • у родителя есть pointer-events, transform или абсолютное позиционирование;
  • первый тап только раскрывает hover-слой;
  • в обработчике есть event.preventDefault(), но переход потом выполняется не всегда.

Для псевдоэлементов можно явно отключить перехват клика:

.download-button::before,
.download-button::after {
  pointer-events: none;
}

.download-button::before, .download-button::after { pointer-events: none; }

Итог: для скачивания используйте нормальный <a href>, не заменяйте его на window.location.href без необходимости, уберите preventDefault() и проверьте, что поверх ссылки нет декоративного слоя. Тогда переход будет с первого касания и на десктопе, и на мобильных.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно