1 document.addEventListener('DOMContentLoaded', function() { 2 // è·åææéè¦æå è½½çå¾ç 3 const lazyImages = document.querySelectorAll('.lazy-image'); 4 const defaultImages = document.querySelectorAll('.default-image'); 5 const spinners = document.querySelectorAll('.spinner'); 6 7 // æ£æ¥æµè§å¨æ¯å¦æ¯æIntersectionObserver 8 if ('IntersectionObserver' in window) { 9 // 使ç¨IntersectionObserver API 10 const imageObserver = new IntersectionObserver((entries, observer) => { 11 entries.forEach(entry => { 12 if (entry.isIntersecting) { 13 const lazyImage = entry.target; 14 loadImage(lazyImage); 15 imageObserver.unobserve(lazyImage); 16 } 17 }); 18 }, { 19 rootMargin: '0px 0px 100px 0px' // æå100pxå è½½ 20 }); 21 22 // è§å¯æææå è½½å¾ç 23 lazyImages.forEach(image => { 24 imageObserver.observe(image); 25 }); 26 } else { 27 // åéæ¹æ¡ï¼ä½¿ç¨æ»å¨äºä»¶çå¬ 28 console.log('IntersectionObserver not supported, using scroll event fallback'); 29 30 // æ·»å æ»å¨äºä»¶çå¬ï¼å¸¦èæµï¼ 31 let lazyLoadThrottleTimeout; 32 function lazyLoad() { 33 if (lazyLoadThrottleTimeout) { 34 clearTimeout(lazyLoadThrottleTimeout); 35 } 36 37 lazyLoadThrottleTimeout = setTimeout(function() { 38 const scrollTop = window.pageYOffset; 39 lazyImages.forEach(image => { 40 if (image.offsetTop < (window.innerHeight + scrollTop + 100)) { 41 loadImage(image); 42 } 43 }); 44 45 // 妿ææå¾çé½å·²å è½½ï¼ç§»é¤äºä»¶çå¬ 46 if (document.querySelectorAll('.lazy-image:not([src])').length === 0) { 47 window.removeEventListener('scroll', lazyLoad); 48 window.removeEventListener('resize', lazyLoad); 49 window.removeEventListener('orientationchange', lazyLoad); 50 } 51 }, 20); 52 } 53 54 // åå§å è½½å¯è§åºåå çå¾ç 55 lazyLoad(); 56 57 // æ·»å äºä»¶çå¬ 58 window.addEventListener('scroll', lazyLoad); 59 window.addEventListener('resize', lazyLoad); 60 window.addEventListener('orientationchange', lazyLoad); 61 } 62 63 // å è½½å¾çç彿° 64 function loadImage(image) { 65 const src = image.getAttribute('data-src'); 66 if (!src) return; 67 68 // å建æ°çImage对象é¢å è½½ 69 const img = new Image(); 70 img.src = src; 71 72 img.onload = () => { 73 // 设置å®é å¾ççsrc 74 image.src = src; 75 76 // æ·»å loadedç±»ä»¥è§¦åæ·¡å ¥ææ 77 setTimeout(() => { 78 image.classList.add('loaded'); 79 80 // æ¾å°å¯¹åºçé»è®¤å¾çåspinner 81 const container = image.closest('.lazybox'); 82 const defaultImg = container.querySelector('.default-image'); 83 const spinner = container.querySelector('.spinner'); 84 85 // éèé»è®¤å¾çåspinner 86 if (defaultImg) { 87 defaultImg.classList.add('hidden'); 88 } 89 if (spinner) { 90 spinner.style.display = 'none'; 91 } 92 }, 100); 93 }; 94 95 img.onerror = () => { 96 console.error(`Error loading image: ${src}`); 97 // å¯ä»¥å¨è¿é设置é误å ä½å¾ 98 }; 99 } 100 });
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.