1/** 2 * é¦é æ¸åçæ¿:忬¡æ²å ¥è¦éæéå§è·³å,çµå°¾æ¼¸æ ¢åæ¢ã 3 * ç®æ¨æ¸åç´æ¥è®èª .sb-stat-v 段è½çæå(å¾å°æ¹æ¸åå³çæ); 4 * åæå«ååä½éè就以ååä½é¡¯ç¤º,æ²æ(å¦å¹´ä»½)å°±ç´æ¸åã 5 * ç¡ JS / reduced-motion æä¿æååä¸åç«ã 6 */ 7(function () { 8 'use strict'; 9 10 var els = document.querySelectorAll('.sb-stat-v'); 11 if (!els.length) return; 12 13 var reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 14 if (reduced || !('IntersectionObserver' in window)) return; 15 16 var items = []; 17 els.forEach(function (el) { 18 var raw = el.textContent.trim(); 19 var target = parseInt(raw.replace(/[^\d]/g, ''), 10); 20 if (!isFinite(target) || target <= 0) return; 21 items.push({ el: el, target: target, grouped: raw.indexOf(',') !== -1 }); 22 }); 23 if (!items.length) return; 24 25 function fmt(n, grouped) { 26 return grouped ? n.toLocaleString('en-US') : String(n); 27 } 28 29 // æåç«çæ æ³ä¸,å æ¸é¶,çæ²å ¥æèµ·è·(é¿å å çå°æçµå¼åè·³å 0) 30 items.forEach(function (it) { it.el.textContent = fmt(0, it.grouped); }); 31 32 function animate(it) { 33 var dur = 1600; 34 var start = null; 35 36 function step(ts) { 37 if (start === null) start = ts; 38 var p = Math.min((ts - start) / dur, 1); 39 // åæ®µæ¥è¿çé,å°¾æ®µæ¼¸æ ¢æ¶å;ææ¸ 2.5 仿¼ quad è cubic,䏿æ 40 var eased = 1 - Math.pow(1 - p, 2.5); 41 it.el.textContent = fmt(Math.round(it.target * eased), it.grouped); 42 if (p < 1) requestAnimationFrame(step); 43 } 44 requestAnimationFrame(step); 45 } 46 47 // è§å¯æ´åçæ¿:å¯¦éæ²å ¥è¦é(è¶ åºåºç·£ 10% çç·©è¡)æä¸èµ·èµ·è·,åªè·ä¸æ¬¡ 48 var container = document.querySelector('.sb-stats') || items[0].el; 49 var fired = false; 50 var io = new IntersectionObserver(function (entries) { 51 entries.forEach(function (entry) { 52 if (entry.isIntersecting && !fired) { 53 fired = true; 54 items.forEach(animate); 55 io.disconnect(); 56 } 57 }); 58 }, { threshold: 0.25, rootMargin: '0px 0px -10% 0px' }); 59 60 io.observe(container); 61})(); 62 63/** 64 * æå網絡å°å:Leaflet + Carto æ·ºç°åºå,ç´ é»+å叿¨ç±¤ã 65 * æ¯æ´å¤å¯¦ä¾(æé»é =ä¸çå+å°ç£åéè¯);loc.big=1 ç«å 大èåé»(ä¸çåä¸çå°ç£)ã 66 */ 67(function () { 68 'use strict'; 69 if ( typeof L === 'undefined' ) return; 70 71 document.querySelectorAll( '.sb-map[data-locations]' ).forEach( function ( el ) { 72 var locations; 73 try { locations = JSON.parse( el.getAttribute( 'data-locations' ) ); } catch ( e ) { return; } 74 75 // data-interactive="1"(æé»é )éæ¾ææ³ç¸®æ¾;é¦é ç¶æéæ çå 76 var interactive = el.getAttribute( 'data-interactive' ) === '1'; 77 var map = L.map( el, { 78 scrollWheelZoom: false, 79 zoomControl: interactive, 80 dragging: interactive, 81 doubleClickZoom: interactive, 82 boxZoom: false, 83 keyboard: interactive, 84 touchZoom: interactive, 85 attributionControl: true, 86 zoomSnap: 0 // å è¨±å°æ¸ zoom:fitBounds å好填滿容å¨,ä¸å æ´æ¸æ¨å»ç大çç©ºç½ 87 } ); 88 89 // åºå(2026-09-24 ææ):CARTO éå§è¦éé°,æ²å¸¶éé°çåç£æè¢«æä¸ 90 // ãAPI KEY REQUIREDãæµ®æ°´å°ä¸¦æ´å¼µæ¨¡ç³ãæ¹ç¨ Esri çæ·ºç°åºå ââ å éé°ã 91 // å ¨çæ¶µè,èä¸åªæé¸å¡æ²æå°å,ç´ é»èæåèªå·±çå叿¨ç±¤æ´éç®ã 92 // è¬ä¸åªå¤© Esri 乿,é£çºæä¸å°åç£å°±èªåéå Wikimedia ç OSM åç£ã 93 var base = L.tileLayer( 94 'https://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}', 95 { attribution: '© Esri © OpenStreetMap contributors', maxZoom: 12 } 96 ).addTo( map ); 97 98 var tileErrors = 0; 99 base.on( 'tileerror', function () { 100 if ( ++tileErrors < 4 ) return; // 鶿失æä¸åä½,é£çºå¤±æææ 101 base.off( 'tileerror' ); 102 map.removeLayer( base ); 103 L.tileLayer( 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png', { 104 attribution: '© OpenStreetMap contributors', 105 maxZoom: 12 106 } ).addTo( map ); 107 } ); 108 109 var bounds = []; 110 locations.forEach( function ( loc ) { 111 bounds.push( loc.c ); 112 L.circleMarker( loc.c, { 113 radius: loc.big ? 10 : 6, 114 color: '#E60012', 115 weight: loc.big ? 3 : 2, 116 fillColor: '#E60012', 117 fillOpacity: loc.big ? 0.55 : 0.85 118 } ).addTo( map ).bindTooltip( loc.n, { 119 permanent: true, 120 // å¯éåå¯ç¨ d æ¬ä½æå®æ¨ç±¤æ¹åé¯é(left/right/top/bottom) 121 direction: loc.d || 'right', 122 offset: { left: [ -8, 0 ], right: [ 8, 0 ], top: [ 0, -8 ], bottom: [ 0, 8 ] }[ loc.d ] || [ 8, 0 ], 123 className: 'sb-map-label' + ( loc.big ? ' sb-map-label--big' : '' ) 124 } ); 125 } ); 126 127 // data-bounds:åºå®è¦é(å¦å°ç£åæ¡ä½å ¨å³¶,ä¸ä»¥æé»çºç) 128 var fixed = el.getAttribute( 'data-bounds' ); 129 if ( fixed ) { 130 try { bounds = JSON.parse( fixed ); } catch ( e ) {} 131 map.fitBounds( bounds, { padding: [ 10, 10 ] } ); 132 } else { 133 map.fitBounds( bounds, { padding: [ 36, 56 ] } ); 134 } 135 } ); 136})();
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.