1. 主页 > 好文章

网页加载完自动执行JS的5大实战方案:从卡顿到丝滑只需这几招

鍚勪綅鑰侀搧锛佹槸涓嶆槸缁忓父閬囧埌杩欑鎯呭喌鈥斺€斿垰鍐欏ソ鐨凧S浠g爜姝绘椿涓嶆墽琛岋紝F12鎵撳紑鎺у埗鍙颁竴鐪嬪叏鏄厓绱犳湭瀹氫箟鐨勬姤閿欙紵鍒厡锛佷粖澶╁挶浠氨涓撻棬娌昏繖绉?椤甸潰娌″姞杞藉畬灏辨€ョ潃鎼炰簨鎯?鐨勬瘺鐥咃紒


鍦烘櫙涓€锛氬垵濮嬪寲鐢ㄦ埛鐣岄潰缁勪欢锛圖OM鍒氭覆鏌撳畬绔嬪埢鎿嶄綔锛?/h3>

鈥?strong>鈥嬬棝鐐规弿杩扳€?/strong>鈥嬶細
濂戒笉瀹规槗鍐欑殑閫夐」鍗″垏鎹㈠姛鑳斤紝缁撴灉椤甸潰涓€鍒锋柊灏辨姤閿?cannot read property 'addEventListener' of null"锛屽綋鍦哄績鎬佺垎鐐葛煉?/p>

鈥?strong>鈥嬫晳鍛戒唬鐮佲€?/strong>鈥嬶細

javascript澶嶅埗
document.addEventListener('DOMContentLoaded', () => {
  const tabs = document.querySelectorAll('.nav-tab');
  tabs.forEach(tab => {
    tab.addEventListener('click', switchTab); 
  });
  console.log('鎵€鏈夐€夐」鍗$粦瀹氭垚鍔燂紒');
});

鈥?strong>鈥嬮伩鍧戞寚鍗椻€?/strong>鈥嬶細

  • 鉁?鐢?code>DOMContentLoaded鑰屼笉鏄痺indow.onload锛堝揩3-5绉掓墽琛岋級
  • 鉂?缁濆涓嶈鍐欐垚document.onready = function(){}锛堜細琚鐩栵級
  • 馃毄 鐜颁唬娴忚鍣ㄩ兘鏀寔锛屼絾IE8浠ヤ笅璇风敤attachEvent

鍦烘櫙浜岋細棣栧睆鏁版嵁棰勫姞杞斤紙绛夊浘鐗?css閮藉姞杞藉畬锛?/h3>

鈥?strong>鈥嬩笟鍔¢渶姹傗€?/strong>鈥嬶細
鐢靛晢缃戠珯闇€瑕佸厛鍔犺浇瀹屾墍鏈夊晢鍝佸浘鍐嶆樉绀轰环鏍艰绠楀櫒锛岄槻姝㈠嚭鐜板浘鐗囬敊浣?/p>

鈥?strong>鈥嬮珮闃跺啓娉曗€?/strong>鈥嬶細

javascript澶嶅埗
window.onload = () => {
  initPriceCalculator();
  lazyLoadImages();
  console.log('杩炶儗鏅浘閮藉姞杞藉畬浜嗭紝鏀惧績鎿嶄綔锛?);
};

// 鎴栬€呯敤鐜颁唬API
window.addEventListener('load', initAnalytics);

鈥?strong>鈥嬫€ц兘瀵规瘮鈥?/strong>鈥嬶細

鏂规硶瑙﹀彂鏃舵満閫傜敤鍦烘櫙
DOMContentLoadedHTML瑙f瀽瀹屾垚琛ㄥ崟楠岃瘉/浜嬩欢缁戝畾
window.onload鎵€鏈夎祫婧愬姞杞藉畬姣?/td>鍥剧墖甯冨眬/澶嶆潅璁$畻
requestIdleCallback娴忚鍣ㄧ┖闂叉椂闈炵揣鎬ヤ换鍔?/td>

鍦烘櫙涓夛細绗笁鏂瑰箍鍛婂欢杩熷姞杞斤紙绛変富瑕佸唴瀹规覆鏌撳悗锛?/h3>

鈥?strong>鈥嬭娉暀璁€?/strong>鈥嬶細
鏌愭鎶婂箍鍛婅剼鏈斁鍦ㄩ噷锛屽鑷撮〉闈㈢櫧灞?5绉掞紝琚€佹澘褰撳満鎶撹幏锛?/p>

鈥?strong>鈥嬬瀛︽柟妗堚€?/strong>鈥嬶細

html杩愯澶嶅埗
<body>
  
  <script defer src="ads.js">script>
body>


<script>
  window.addEventListener('load', () => {
    const adScript = document.createElement('script');
    adScript.src = 'https://ad.com/sdk.js';
    document.body.appendChild(adScript);
  });
script>

鈥?strong>鈥嬫晥鏋滃疄娴嬧€?/strong>鈥嬶細
骞垮憡鍔犺浇鏃舵満浠?code>DOM瑙f瀽涓?/code>鎺ㄨ繜鍒?code>椤甸潰娓叉煋鍚?/code>锛岄灞忛€熷害鎻愬崌68%锛?/p>


鍦烘櫙鍥涳細SPA搴旂敤鏁版嵁棰勫彇锛堢幇浠f鏋朵笓鐢級

鈥?strong>鈥媀ue/React寮€鍙戞棩甯糕€?/strong>鈥嬶細
鏄庢槑鐢ㄤ簡vue-router锛屼负浠€涔堥〉闈㈠垏鎹㈡椂杩樹細闂睆锛?/p>

鈥?strong>鈥嬬绾ф搷浣溾€?/strong>鈥嬶細

javascript澶嶅埗
// Vue绀轰緥
new Vue({
  mounted() {
    this.$nextTick(() => {
      fetchUserData();
      initChart();
    });
  }
});

// React绀轰緥
useEffect(() => {
  const timer = setTimeout(() => {
    loadRecommendations();
  }, 300);
  return () => clearTimeout(timer);
}, []);

鈥?strong>鈥嬪簳灞傚師鐞嗏€?/strong>鈥嬶細
鍒╃敤妗嗘灦鐢熷懡鍛ㄦ湡閽╁瓙锛岀瓑铏氭嫙DOM鏇存柊瀹屽啀鎿嶄綔鐪熷疄DOM


鍦烘櫙浜旓細鍔ㄦ€佸唴瀹圭洃鍚紙AJAX鍔犺浇鍚庣殑鍏冪礌锛?/h3>

鈥?strong>鈥嬪ご鐤奸棶棰樷€?/strong>鈥嬶細
閫氳繃鎺ュ彛鍔犺浇鐨勮瘎璁哄尯鍏冪礌锛屾€庝箞鑷姩缁戝畾鐐硅禐鍔熻兘锛?/p>

鈥?strong>鈥嬮粦绉戞妧鐧诲満鈥?/strong>鈥嬶細

javascript澶嶅埗
const observer = new MutationObserver(mutations => {
  mutations.forEach(mutation => {
    if (mutation.addedNodes.length) {
      bindLikeButtons();
    }
  });
});

observer.observe(document.getElementById('comments'), {
  childList: true,
  subtree: true
});

鈥?strong>鈥嬫晥鏋滆鏄庘€?/strong>鈥嬶細
鍙璇勮鍖烘湁鏂板鑺傜偣锛岃嚜鍔ㄨЕ鍙戜簨浠剁粦瀹氾紝姣旇疆璇㈡娴嬩紭闆?00鍊嶏紒


鑰佸徃鏈虹粡楠岃皥

骞蹭簡浜斿勾鍓嶇锛岃杩囧お澶?椤甸潰鏈姞杞藉畬灏辨墽琛?寮曞彂鐨勬儴妗堛€傚幓骞存湁涓」鐩紝鍥犱负鎬ョ潃鍦ㄩ噷鎵ц鐢ㄦ埛鐢诲儚鍒嗘瀽锛屽鑷村叧閿覆鏌撹矾寰勮闃诲锛岄灞忔椂闂寸洿鎺ラ鍒?2绉掞紒鍚庢潵鏀圭敤document.addEventListener('DOMContentLoaded')閲嶅啓锛屾€ц兘绔嬪噺70%锛?/p>

鐜板湪甯﹀洟闃熸湁涓搧寰嬶細鈥?strong>鈥嬫墍鏈塉S鑴氭湰蹇呴』鏄庣‘澹版槑鎵ц鏃舵満鈥?/strong>鈥嬨€傚氨鍍忕倰鑿滃緱鎺屾彙鐏€欙紝璇ョ垎鐐掓椂涓嶈兘鎱㈢倴锛岃鏂囩伀鏃朵笉鑳界寷鏀汇€傜壒鍒槸鍋氭捣澶栭」鐩椂锛岄偅浜涚敤3G缃戠粶鐨勭敤鎴凤紝鑴氭湰鍔犺浇椤哄簭宸?绉掞紝璺冲嚭鐜囪兘宸?0%锛?/p>

鏈€鍚庨€佸ぇ瀹朵竴鍙ヨ瘽锛氣€?strong>鈥嬮〉闈㈠姞杞戒笉鏄巹瀛︼紝鎵ц鏃舵満鍐冲畾鐢熸鈥?/strong>鈥嬨€傛妸杩欎簺鏂规瀛樿繘浣犵殑浠g爜姝﹀櫒搴擄紝涓嬫閬囧埌鍔犺浇闂鐩存帴鎶勫浼欎笂锛?/p>

本文由嘻道妙招独家原创,未经允许,严禁转载