PageSourceSearch

https://vestnikkui.ru/bundles/journals/js/front-image-fallback.js

js vestnikkui.ru collected 2026-10-02 20:03:19 UTC 2,940 bytes, 90 lines download raw bytes

1(function () {
2    var body = document.body;
3    var avatarFallbackSrc = body.getAttribute('data-avatar-fallback-src') || '';
4    var legacyCoverFallbackSrc = body.getAttribute('data-cover-fallback-src') || '';
5
6    function isCoverContainer(node) {
7        return node && node.classList && (
8            node.classList.contains('catalog-image')
9            || node.classList.contains('journal-cover')
10            || node.classList.contains('detail-cover-card')
11            || node.classList.contains('issue-cover')
12        );
13    }
14
15    function applyCoverContainerFallback(img, parent) {
16        img.classList.add('is-broken');
17        if (!parent.querySelector('.cover-fallback')) {
18            var fallback = document.createElement('div');
19            fallback.className = 'cover-fallback';
20            parent.appendChild(fallback);
21        }
22    }
23
24    function applyAvatarFallback(img) {
25        var fallbackSrc = img.getAttribute('data-avatar-fallback-src') || avatarFallbackSrc;
26
27        if (!fallbackSrc || img.getAttribute('src') === fallbackSrc) {
28            return;
29        }
30        img.classList.add('is-broken');
31        img.setAttribute('src', fallbackSrc);
32    }
33
34    function applyLegacyCardFallback(img) {
35        var fallbackSrc = img.getAttribute('data-cover-fallback-src') || legacyCoverFallbackSrc;
36
37        if (!fallbackSrc || img.getAttribute('src') === fallbackSrc) {
38            return;
39        }
40        img.classList.add('is-broken');
41        img.setAttribute('src', fallbackSrc);
42    }
43
44    function applyFallback(img) {
45        if (!img || img.tagName !== 'IMG') {
46            return;
47        }
48
49        var parent = img.parentNode;
50
51        if (
52            img.classList.contains('avatar')
53            || img.classList.contains('author-avatar')
54            || img.getAttribute('data-image-role') === 'avatar'
55        ) {
56            applyAvatarFallback(img);
57            return;
58        }
59
60        if (isCoverContainer(parent)) {
61            applyCoverContainerFallback(img, parent);
62            return;
63        }
64
65        if (parent && parent.classList && parent.classList.contains('content-block') && parent.classList.contains('info-block') && !img.classList.contains('no-fallback')) {
66            applyLegacyCardFallback(img);
67        }
68    }
69
70    function sweepBrokenImages() {
71        var images = document.querySelectorAll('img');
72        images.forEach(function (img) {
73            var src = (img.getAttribute('src') || '').trim();
74            if (!src) {
75                applyFallback(img);
76                return;
77            }
78            if (img.complete && img.naturalWidth === 0) {
79                applyFallback(img);
80            }
81        });
82    }
83
84    document.addEventListener('error', function (event) {
85        applyFallback(event.target);
86    }, true);
87
88    document.addEventListener('DOMContentLoaded', sweepBrokenImages);
89    window.addEventListener('load', sweepBrokenImages);
90})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.