Новый экспериментальный PhotoSwipeLightbox (siteSettings.experimental_lightbox) содержит ошибки, когда ссылка на изображение существует в Discourse Solved или в компоненте загрузки в admin/config/logo, а также в местах, где отсутствует размеченный HTML-тег [img].
Корень проблемы заключается в том, что PhotoSwipeLightbox требует ширины и высоты уже загруженного изображения, тогда как Discourse Solved и компонент загрузки не имеют этих атрибутов.
Без этих атрибутов изображение растягивается, чтобы заполнить окно браузера, что приводит к искажению, как показано на приложенном рисунке.
Этот коммит добавляет механизм предварительной загрузки для изображений без размеров, чтобы получить их размеры, так что они могут отображаться корректно.
Спасибо за сообщение об этой проблеме и предоставление исправления.
Я добавил несколько комментариев и предложений к PR, но в целом, думаю, нам нужен подобный механизм резервного копирования для обработки пограничных случаев.
Также я внес некоторые изменения в логику определения типа, чтобы обрабатывать случаи, когда метаданные присутствуют, но не содержат информацию о размере (например, компонент загрузки).
@davidb Похоже, что в одном из последних коммитов компонента lightbox есть ошибка, из-за которой компонент не запускается в Discourse Solved и подобных местах после слияния моего PR.
Я не до конца уверен, действительно ли этот PR вызывает сбой.
Воспроизвести ошибку можно прямо сейчас здесь:
Например, нажав на [IMG_6085] в цитате onebox или открыв ссылку и кликнув по изображению ответа в компоненте Discourse Solved на указанной странице. Изначальное поведение — открытие lightbox, но сейчас ничего не происходит.
В консоли отображается ошибка: Uncaught TypeError: Cannot read properties of null (reading 'getAttribute').
Связанный код:
// это гарантирует, что обрезанные изображения (например, в сетке) не вызовут дрожания при закрытии
data.thumbCropped = true;
data.src = data.src || el.getAttribute("data-large-src");
-> data.origSrc = imgEl.getAttribute("data-orig-src");
data.title = el.title || imgEl.alt || imgEl.title;
Возможно, изменение кода следующим образом решит проблему: