<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains Mono',monospace;font-size:9.8pt;"><span style="color:#629755;font-style:italic;">/**<br/></span><span style="color:#629755;font-style:italic;"> * </span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">懒加载<br/></span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;"> </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@description </span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">可加载</span><span style="color:#629755;font-style:italic;">`<img>`</span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">、</span><span style="color:#629755;font-style:italic;">`<video>`</span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">、</span><span style="color:#629755;font-style:italic;">`<audio>`</span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">等一些引用资源路径的标签<br/></span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;"> </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@param </span><span style="color:#8a653b;font-style:italic;">{object} params </span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">传参对象<br/></span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;"> </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@param </span><span style="color:#8a653b;font-style:italic;">{string?} params.lazyAttr </span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">自定义加载的属性(可选)<br/></span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;"> </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@param </span><span style="color:#8a653b;font-style:italic;">{"src"|"background"} params.loadType </span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">加载的类型(默认为</span><span style="color:#629755;font-style:italic;">`src`</span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">)<br/></span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;"> </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@param </span><span style="color:#8a653b;font-style:italic;">{string?} params.errorPath </span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">加载失败时显示的资源路径,仅在</span><span style="color:#629755;font-style:italic;">`loadType`</span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">设置为</span><span style="color:#629755;font-style:italic;">`src`</span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">中可用(可选)<br/></span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;"> </span><span style="color:#629755;font-style:italic;">*/<br/></span><span style="color:#cc7832;">function </span><span style="color:#ffc66d;">lazyLoad</span>(params) {<br/> <span style="color:#cc7832;">var </span>attr = (params && params.lazyAttr) || <span style="color:#6a8759;">"lazy"</span><span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> var </span>type = (params && params.loadType) || <span style="color:#6a8759;">"src"</span><span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"><br/></span><span style="color:#cc7832;"> </span><span style="color:#629755;font-style:italic;">/** </span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">更新整个文档的懒加载节点 </span><span style="color:#629755;font-style:italic;">*/<br/></span><span style="color:#629755;font-style:italic;"> </span><span style="color:#cc7832;">function </span><span style="color:#ffc66d;">update</span>() {<br/> <span style="color:#cc7832;">var </span>els = <span style="color:#9876aa;font-weight:bold;font-style:italic;">document</span>.<span style="color:#ffc66d;">querySelectorAll</span>(<span style="color:#6a8759;">"[" </span>+ attr + <span style="color:#6a8759;">"]"</span>)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> for </span>(<span style="color:#cc7832;">var </span>i = <span style="color:#6897bb;">0</span><span style="color:#cc7832;">; </span>i < els.<span style="color:#9876aa;">length</span><span style="color:#cc7832;">; </span>i++) {<br/> <span style="color:#cc7832;">var </span>el = els[i]<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> </span>observer.<span style="color:#ffc66d;">observe</span>(el)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> </span>}<br/> }<br/><br/> <span style="color:#629755;font-style:italic;">/**<br/></span><span style="color:#629755;font-style:italic;"> * </span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">加载图片<br/></span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;"> </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@param </span><span style="color:#8a653b;font-style:italic;">{HTMLImageElement} el </span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">图片节点<br/></span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;"> </span><span style="color:#629755;font-style:italic;">*/<br/></span><span style="color:#629755;font-style:italic;"> </span><span style="color:#cc7832;">function </span><span style="color:#ffc66d;">loadImage</span>(el) {<br/> <span style="color:#cc7832;">var </span>cache = el.<span style="color:#9876aa;">src</span><span style="color:#cc7832;">; </span><span style="color:#808080;">// </span><span style="color:#808080;font-family:'宋体',monospace;">缓存当前</span><span style="color:#808080;">`src`</span><span style="color:#808080;font-family:'宋体',monospace;">加载失败时候用<br/></span><span style="color:#808080;font-family:'宋体',monospace;"> </span>el.<span style="color:#9876aa;">src </span>= el.<span style="color:#ffc66d;">getAttribute</span>(attr)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> </span>el.<span style="color:#9876aa;">onerror </span>= <span style="color:#cc7832;">function </span>() {<br/> el.<span style="color:#9876aa;">src </span>= (params && params.errorPath) || cache<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> </span>}<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> </span>}<br/><br/> <span style="color:#629755;font-style:italic;">/**<br/></span><span style="color:#629755;font-style:italic;"> * </span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">加载单个节点<br/></span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;"> </span><span style="color:#629755;font-style:italic;">* </span><span style="color:#629755;font-weight:bold;font-style:italic;">@param </span><span style="color:#8a653b;font-style:italic;">{HTMLElement} el<br/></span><span style="color:#8a653b;font-style:italic;"> </span><span style="color:#629755;font-style:italic;">*/<br/></span><span style="color:#629755;font-style:italic;"> </span><span style="color:#cc7832;">function </span><span style="color:#ffc66d;">loadElement</span>(el) {<br/> <span style="color:#cc7832;">switch </span>(type) {<br/> <span style="color:#cc7832;">case </span><span style="color:#6a8759;">"src"</span>:<br/> <span style="color:#ffc66d;">loadImage</span>(el)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> break;<br/></span><span style="color:#cc7832;"> case </span><span style="color:#6a8759;">"background"</span>:<br/> el.<span style="color:#9876aa;">style</span>.<span style="color:#9876aa;">backgroundImage </span>= <span style="color:#6a8759;">"url(" </span>+ el.<span style="color:#ffc66d;">getAttribute</span>(attr) + <span style="color:#6a8759;">")"</span><span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> break;<br/></span><span style="color:#cc7832;"> </span>}<br/> el.<span style="color:#ffc66d;">removeAttribute</span>(attr)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> </span>observer.<span style="color:#ffc66d;">unobserve</span>(el)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> </span>}<br/><br/> <span style="color:#629755;font-style:italic;">/**<br/></span><span style="color:#629755;font-style:italic;"> * </span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">监听器<br/></span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;"> </span><span style="color:#629755;font-style:italic;">* [MDN</span><span style="color:#629755;font-style:italic;font-family:'宋体',monospace;">说明</span><span style="color:#629755;font-style:italic;">](https://developer.mozilla.org/zh-CN/docs/Web/API/IntersectionObserver)<br/></span><span style="color:#629755;font-style:italic;"> */<br/></span><span style="color:#629755;font-style:italic;"> </span><span style="color:#cc7832;">var </span>observer = <span style="color:#cc7832;">new </span><span style="color:#ffc66d;">IntersectionObserver</span>(<span style="color:#cc7832;">function </span>(entries) {<br/> <span style="color:#cc7832;">for </span>(<span style="color:#cc7832;">var </span>i = <span style="color:#6897bb;">0</span><span style="color:#cc7832;">; </span>i < entries.<span style="color:#9876aa;">length</span><span style="color:#cc7832;">; </span>i++) {<br/> <span style="color:#cc7832;">var </span>item = entries[i]<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> if </span>(item.<span style="color:#9876aa;">isIntersecting</span>) {<br/> <span style="color:#ffc66d;">loadElement</span>(item.<span style="color:#9876aa;">target</span>)<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"> </span>}<br/> }<br/> })<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"><br/></span><span style="color:#cc7832;"> </span><span style="color:#ffc66d;">update</span>()<span style="color:#cc7832;">;<br/></span><span style="color:#cc7832;"><br/></span><span style="color:#cc7832;"> return </span>{<br/> observer: observer<span style="color:#cc7832;">,<br/></span><span style="color:#cc7832;"> </span><span style="color:#ffc66d;">update</span>: <span style="color:#ffc66d;">update<br/></span><span style="color:#ffc66d;"> </span>}<span style="color:#cc7832;">;<br/></span>}</pre><p>低版本浏览器请在上面的代码前引入</p><pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains Mono',monospace;font-size:9.8pt;"><span style="color:#e8bf6a;"><script </span><span style="color:#bababa;">src</span><span style="color:#a5c261;">="https://polyfill.io/v3/polyfill.min.js?features=IntersectionObserver"</span><span style="color:#e8bf6a;">></script></span></pre><p>参考<span style="color: rgb(49, 49, 49); font-family: "Microsoft Yahei UI", "Microsoft Yahei", "Helvetica Neue", Helvetica, "Nimbus Sans L", Arial, "Liberation Sans", "Hiragino Sans GB", "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", SimHei, "WenQuanYi Zen Hei Sharp", sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);">来源:https://juejin.cn/post/6844904066418491406#heading-3</span></p>
相关文章