1function handleTabChange(id, index) { 2 const tabs = document.getElementById(id).querySelectorAll(".tab-item"); 3 const contents = document.getElementById(id).querySelectorAll(".tab-content"); 4 tabs.forEach((o) => { 5 o.classList.remove("active"); 6 }); 7 tabs[index].classList.add("active"); 8 contents.forEach((o) => { 9 o.classList.add("hidden"); 10 }); 11 contents[index].classList.remove("hidden"); 12} 13 14function handleTabChangecountry(id, index) { 15 const tabs = document.getElementById(id).querySelectorAll(".tab-item-country"); 16 const contents = document.getElementById(id).querySelectorAll(".tab-content-country"); 17 tabs.forEach((o) => { 18 o.classList.remove("active"); 19 }); 20 tabs[index].classList.add("active"); 21 contents.forEach((o) => { 22 o.classList.add("hidden"); 23 }); 24 contents[index].classList.remove("hidden"); 25} 26 27function changeMobileMenu(isShow) { 28 const mobileMenu = document.getElementById("mobile-menu"); 29 isShow 30 ? mobileMenu.classList.remove("hidden") 31 : mobileMenu.classList.add("hidden"); 32} 33function changeMenuDirection(idx) { 34 const mobileMenu = document.getElementById("mobile-menu"); 35 const submenu = mobileMenu.querySelectorAll(".submenu"); 36 const icon = mobileMenu.querySelectorAll(".turn-arrow"); 37 if (idx >= 0 && idx < submenu.length && idx < icon.length) { 38 const isRotated = icon[idx].classList.toggle("rotate-180"); 39 submenu[idx].classList.toggle("hidden", !isRotated); 40 } 41} 42 43document.addEventListener("DOMContentLoaded", function () { 44 var lazyImages = [].slice.call(document.querySelectorAll("img.lazy-load")); 45 if ("IntersectionObserver" in window) { 46 let lazyImageObserver = new IntersectionObserver(function (entries, observer) { 47 entries.forEach(function (entry) { 48 if (entry.isIntersecting) { 49 let lazyImage = entry.target; 50 lazyImage.src = lazyImage.dataset.src; 51 lazyImage.classList.remove("lazy-load"); 52 lazyImageObserver.unobserve(lazyImage); 53 } 54 }); 55 }); 56 57 lazyImages.forEach(function (lazyImage) { 58 lazyImageObserver.observe(lazyImage); 59 }); 60 } else { 61 // å¤ç䏿¯æIntersectionObserverçæ åµ 62 lazyImages.forEach(function (lazyImage) { 63 lazyImage.src = lazyImage.dataset.src; 64 lazyImage.classList.remove("lazy-load"); 65 }); 66 } 67}); 68 69document.addEventListener('DOMContentLoaded', function() { 70 const lazyBackgrounds = document.querySelectorAll('.lazy-background'); 71 const observer = new IntersectionObserver((entries, observer) => { 72 entries.forEach(entry => { 73 if (entry.isIntersecting) { 74 const bg = entry.target.dataset.src; 75 entry.target.style.backgroundImage = `url(${bg})`; 76 observer.unobserve(entry.target); 77 } 78 }); 79 }); 80 81 lazyBackgrounds.forEach(background => { 82 observer.observe(background); 83 }); 84}); 85 86 87 88 89 90document.addEventListener("DOMContentLoaded", function() { 91 // å®ä¹æ ¸å¿å ç´ 92 const caidanBtn = document.querySelector('.icon-caidan'); 93 const closeBtn = document.querySelector('.btn-close'); 94 const offcanvasEl = document.querySelector('.offcanvas'); 95 96 // é®ç½©å±åå»ºå½æ° 97 function createBackdrop() { 98 // å æ£æ¥æ¯å¦å·²åå¨é®ç½©å±ï¼é¿å éå¤å建 99 const existingBackdrop = document.querySelector('.offcanvas-backdrop'); 100 if (existingBackdrop) return; 101 102 // å建é®ç½©å±å ç´ 103 const backdrop = document.createElement('div'); 104 backdrop.className = 'offcanvas-backdrop fade show'; 105 106 // å°é®ç½©å±æå ¥å°offcanvasçå级ä½ç½®ï¼ä¸æ¹ï¼ 107 if (offcanvasEl && offcanvasEl.parentNode) { 108 offcanvasEl.parentNode.insertBefore(backdrop, offcanvasEl.nextSibling); 109 } 110 } 111 112 // é®ç½©å±ç§»é¤å½æ° 113 function removeBackdrop() { 114 const backdrop = document.querySelector('.offcanvas-backdrop'); 115 if (backdrop) { 116 backdrop.remove(); 117 } 118 } 119 120 // ç¡®ä¿æ ¸å¿å ç´ åå¨åç»å®äºä»¶ 121 if (offcanvasEl) { 122 // ç¹å»èåæé®ï¼æ¾ç¤ºoffcanvas + å建é®ç½©å± 123 if (caidanBtn) { 124 caidanBtn.addEventListener('click', function() { 125 offcanvasEl.classList.add('show'); 126 createBackdrop(); 127 128 // å¯éï¼ç¹å»é®ç½©å±ä¹å ³éï¼å¸¸è§äº¤äºéæ±ï¼ 129 const backdrop = document.querySelector('.offcanvas-backdrop'); 130 if (backdrop) { 131 backdrop.addEventListener('click', function() { 132 offcanvasEl.classList.remove('show'); 133 removeBackdrop(); 134 }); 135 } 136 }); 137 } 138 139 // ç¹å»å ³éæé®ï¼éèoffcanvas + ç§»é¤é®ç½©å± 140 if (closeBtn) { 141 closeBtn.addEventListener('click', function() { 142 offcanvasEl.classList.remove('show'); 143 removeBackdrop(); 144 }); 145 } 146 } 147}); 148 149 150 151 152 153// å ¨å±åéï¼å卿å/å¤±è´¥å¾æ è·¯å¾ï¼å·²å¡«åå®é è·¯å¾ï¼ 154const ICONS = { 155 success: 'https://cdn2.zcqtz.com/qp/static/index/img/success-icon.webp', 156 error: 'https://cdn2.zcqtz.com/qp/static/index/img/error-icon.webp' 157}; 158 159// å ¨å±åéï¼ç®¡çé误浮å±å宿¶å¨ï¼ç¡®ä¿åæ¬¡åªæ¾ç¤ºä¸ä¸ªæµ®å± 160let currentErrorTip = null; 161let errorTipTimer = null; 162 163// å ¨å±é ç½®ï¼æ¥å£å°åï¼å¯æ ¹æ®å®é 项ç®ä¿®æ¹ï¼ 164const API_CONFIG = { 165 formSubmitUrl: '/Api/insertGeneralFilingInfo' // çå®è¡¨åæäº¤æ¥å£å°å 166};
167 168/** 169* 表åæäº¤ä¸»å½æ° 170* @param {string|number} index - 表åç´¢å¼ï¼ç¨äºåºåå¤ä¸ªè¡¨åï¼ 171*/ 172function sub_msg(index = '') { 173 174 // æ ¹æ®ç´¢å¼æ¼æ¥è¡¨åå ç´ IDåç¼ï¼éé å¤ä¸ªè¡¨åï¼ 175 const suffix = index !== '' ? `_${index}` : ''; 176 const nameEl = document.getElementById(`name_fast${suffix}`); 177 const mobileEl = document.getElementById(`mobile_fast${suffix}`); 178 const contentEl = document.getElementById(`message_fast${suffix}`); 179 180 // æ¸ é¤åå²é误æç¤ºå宿¶å¨ 181 clearErrorTips(); 182 183 // 1. è¡¨åæ ¡éªé»è¾ï¼é¡ºåºæ ¡éªï¼åªæç¤ºç¬¬ä¸ä¸ªéè¯¯ï¼ 184 // éªè¯å§åï¼å¿ å¡«ï¼ 185 if (!nameEl.value.trim()) { 186 showErrorTip(nameEl, '请è¾å ¥æ¨çç§°å¼'); 187 return; 188 } 189 // éªè¯ææºå·ï¼å¿ å¡«+æ ¼å¼ï¼ 190 const mobileReg = /^1[3-9]\d{9}$/; 191 if (!mobileEl.value.trim()) { 192 showErrorTip(mobileEl, '请è¾å ¥ææºå·ç '); 193 return; 194 } else if (!mobileReg.test(mobileEl.value.trim())) { 195 showErrorTip(mobileEl, '请è¾å ¥æ£ç¡®çææºå·ç '); 196 return; 197 } 198 // éªè¯çè¨ï¼å¿ å¡«ï¼ 199 if (!contentEl.value.trim()) { 200 showErrorTip(contentEl, '请è¾å ¥æ¨ççè¨'); 201 return; 202 } 203 204 // 2. æ´ç表åæäº¤æ°æ® 205 const formData = { 206 name: nameEl.value.trim(), 207 mobile: mobileEl.value.trim(), 208 content: contentEl.value.trim(), 209 current_url: window.location.href, 210 formIndex: index // å¯éï¼ä¼ é表åç´¢å¼ï¼ä¾¿äºå端åºåå¤è¡¨å 211 }; 212 213 // 3. è°ç¨åçAJAXæäº¤è¡¨åï¼æ¿æ¢å模ææäº¤ï¼ 214 submitFormByAjax(formData) 215 .then(() => { 216 // æäº¤æåï¼æ¾ç¤ºæåå¼¹çª+é置表å 217 showResultModal(true, 'æäº¤æåï¼æä»¬ä¼å°½å¿«ä¸æ¨èç³»'); 218 nameEl.value = ''; 219 mobileEl.value = ''; 220 contentEl.value = ''; 221 }) 222 .catch(errorMsg => { 223 // æäº¤å¤±è´¥ï¼æ¾ç¤ºå¤±è´¥å¼¹çªï¼æç¤ºå ·ä½é误信æ¯ï¼ 224 showResultModal(false, errorMsg || 'æäº¤å¤±è´¥ï¼è¯·ç¨åéè¯'); 225 }); 226} 227 228/** 229* åçAJAX表åæäº¤ï¼æ ¸å¿æ¥å£è¯·æ±é»è¾ï¼ 230* @param {Object} formData - è¡¨åæ°æ®ï¼name/mobile/contentï¼ 231* @returns {Promise} - æäº¤ç»æï¼æåresolve/失败rejectï¼ 232*/ 233function submitFormByAjax(formData) { 234 return new Promise((resolve, reject) => { 235 // 1. å建XMLHttpRequest对象ï¼å ¼å®¹ç°ä»£æµè§å¨+IE6+ï¼ 236 let xhr; 237 if (window.XMLHttpRequest) { 238 xhr = new XMLHttpRequest(); 239 } else { 240 xhr = new ActiveXObject('Microsoft.XMLHTTP'); 241 } 242 243 // 2. åå§å请æ±ï¼POSTæ¹å¼ï¼æ¥å£å°åï¼å¼æ¥ï¼ 244 xhr.open('POST', API_CONFIG.formSubmitUrl, true); 245 246 // 3. 设置请æ±å¤´ï¼è¡¨åæäº¤é»è®¤æ ¼å¼ï¼application/x-www-form-urlencodedï¼ 247 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 248 // å¯éï¼è¥æ¥å£éè¦è®¤è¯ï¼æ·»å Token请æ±å¤´ï¼æ ¹æ®å®é éæ±ä¿®æ¹ï¼ 249 // xhr.setRequestHeader('Authorization', 'Bearer ' + getToken()); 250 251 // 4. è®¾ç½®è¶ æ¶æ¶é´ï¼5ç§ï¼é¿å 请æ±é¿ææèµ·ï¼ 252 xhr.timeout = 5000; 253 254 // 5. çå¬è¯·æ±ç¶æååï¼å¤çååºï¼ 255 xhr.onreadystatechange = function() { 256 // readyState=4ï¼è¯·æ±å®æï¼status=200~299ï¼HTTPç¶æç æå 257 if (xhr.readyState === 4) { 258 try { 259 // è§£ææ¥å£è¿åçJSONæ°æ®ï¼å设å端è¿åJSONæ ¼å¼ï¼ 260 const response = JSON.parse(xhr.responseText); 261 // æå端约å®å¤ææå/失败ï¼ç¤ºä¾ï¼code=200为æåï¼ 262 if (response.code === 200) { 263 resolve(); // æåï¼è§¦åthenåè° 264 } else { 265 // 失败ï¼ä¼ éå端è¿åçé误信æ¯ï¼å¦"ææºå·å·²åå¨"ï¼ 266 reject(response.message || 'æ¥å£è¿åé误'); 267 } 268 } catch (error) { 269 // éJSONæ ¼å¼ååºï¼å¦æå¡å¨é误页é¢ï¼ï¼æç¤ºè§£æå¤±è´¥ 270 reject('æ¥å£ååºæ ¼å¼é误ï¼è¯·èç³»ææ¯æ¯æ'); 271 } 272 } 273 }; 274 275 // 6. çå¬ç½ç»é误ï¼å¦æç½ãè·¨åæªé ç½®çï¼ 276 xhr.onerror = function() { 277 reject('ç½ç»å¼å¸¸ï¼è¯·æ£æ¥ç½ç»è¿æ¥åéè¯'); 278 }; 279 280 // 7. çå¬è¯·æ±è¶ æ¶ 281 xhr.ontimeout = function() { 282 reject('请æ±è¶ æ¶ï¼è¯·ç¨åéè¯'); 283 }; 284 285 // 8. å¤çè¡¨åæ°æ®ï¼è½¬ä¸ºURLç¼ç æ ¼å¼ï¼name=å¼ ä¸&mobile=13800138000ï¼ 286 const paramStr = Object.keys(formData) 287 .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(formData[key])}`) 288 .join('&'); 289 290 // 9. åé请æ±ï¼POSTè¯·æ±æ°æ®æ¾å¨è¯·æ±ä½ä¸ï¼ 291 xhr.send(paramStr); 292 }); 293} 294 295/** 296* æ¾ç¤ºé误æç¤ºæµ®å±ï¼è¡¨åæ ¡éªå¤±è´¥æ¶è°ç¨ï¼ 297* @param {HTMLElement} element - å ³èçè¾å ¥æ¡å ç´ 298* @param {string} message - é误æç¤ºææ¬ 299*/ 300function showErrorTip(element, message) { 301 // å æ¸ é¤å·²åå¨çé误浮å±å宿¶å¨ 302 clearErrorTips(); 303 304 // 1. å建é误浮å±å ç´ ï¼ä¾èµå¤é¨CSSç±»ï¼error-tip-1ï¼ 305 const tip = document.createElement('div'); 306 tip.className = 'error-tip-1'; 307 tip.textContent = message; 308 309 // 2. è®¡ç®æµ®å±ä½ç½®ï¼ä¼å æ¾ç¤ºå¨è¾å ¥æ¡ä¸æ¹ï¼ç©ºé´ä¸è¶³åå³ä¾§ï¼ 310 const elementRect = element.getBoundingClientRect(); 311 if (window.innerHeight - elementRect.bottom > 4) { 312 // 䏿¹ç©ºé´è¶³å¤ï¼æ¾ç¤ºå¨æ£ä¸æ¹ 313 tip.style.top = '0'; 314 tip.style.right = '0'; 315 tip.style.marginTop = '3px'; 316 } else { 317 // 䏿¹ç©ºé´ä¸è¶³ï¼æ¾ç¤ºå¨å³ä¾§ 318 tip.style.left = '100%'; 319 tip.style.top = '50%'; 320 tip.style.transform = 'translateY(-50%)'; 321 tip.style.marginLeft = '10px'; 322 } 323 324 // 3. æ·»å æµ®å±å°è¾å ¥æ¡ç¶å®¹å¨ï¼ç¡®ä¿ç¶å®¹å¨ç¸å¯¹å®ä½ï¼ 325 const parent = element.parentElement; 326 parent.appendChild(tip); 327 currentErrorTip = tip; 328 329 // 4. 3ç§åèªå¨æ¸ 餿µ®å± 330 errorTipTimer = setTimeout(() => { 331 clearErrorTips(); 332 }, 3000); 333} 334 335/** 336* æ¸ é¤é误æç¤ºï¼æµ®å±+宿¶å¨ï¼ 337*/ 338function clearErrorTips() { 339 // æ¸ é¤å½åæµ®å± 340 if (currentErrorTip) { 341 currentErrorTip.remove(); 342 currentErrorTip = null; 343 } 344 // æ¸ é¤èªå¨æ¶å¤±å®æ¶å¨ 345 if (errorTipTimer) { 346 clearTimeout(errorTipTimer); 347 errorTipTimer = null; 348 } 349} 350 351/** 352* æ¾ç¤ºæäº¤ç»æå¼¹çªï¼æå/失败éç¨ï¼ 353* @param {boolean} isSuccess - æ¯å¦æäº¤æå 354* @param {string} message - å¼¹çªæç¤ºææ¬ 355*/ 356function showResultModal(isSuccess, message) { 357 // 1. å建é®ç½©å±ï¼ä¾èµå¤é¨CSSç±»ï¼result-overlayï¼
358 const overlay = document.createElement('div'); 359 overlay.className = 'result-overlay'; 360 361 // 2. å建弹çªå®¹å¨ï¼ä¾èµå¤é¨CSSç±»ï¼result-modalï¼ 362 const modal = document.createElement('div'); 363 modal.className = 'result-modal'; 364 365 // 3. ç»è£ å¼¹çªå 容ï¼å¾æ +ææ¬+æé®ï¼ 366 // 3.1 ç»æå¾æ 367 const icon = document.createElement('img'); 368 icon.className = 'result-modal-icon'; 369 icon.src = isSuccess ? ICONS.success : ICONS.error; 370 icon.alt = isSuccess ? 'æäº¤æå' : 'æäº¤å¤±è´¥'; 371 372 // 3.2 æç¤ºææ¬ 373 const text = document.createElement('p'); 374 text.className = 'result-modal-text'; 375 text.textContent = message; 376 377 // 3.3 å ³éæé® 378 const btn = document.createElement('button'); 379 btn.className = 'result-modal-btn'; 380 btn.textContent = 'ç¡®å®'; 381 btn.onclick = () => overlay.remove(); // ç¹å»å ³éå¼¹çª 382 383 // 4. 渲æå¼¹çªå°é¡µé¢ 384 modal.appendChild(icon); 385 modal.appendChild(text); 386 modal.appendChild(btn); 387 overlay.appendChild(modal); 388 document.body.appendChild(overlay); 389} 390 391// å¯éï¼è¥éè¦Token认è¯ï¼å¯æ·»å è·åTokençè¾ å©å½æ°ï¼æ ¹æ®å®é ç»å½é»è¾ä¿®æ¹ï¼ 392// function getToken() { 393// return localStorage.getItem('userToken') || ''; 394// } 395 396 397 398
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.