ES6 语法实现入门级公共部分加载

187 阅读1分钟

ES6 语法实现入门级公共部分加载

意图

通过使用原生 JS 实现公共部分的加载,类似于 JQuery 的 selector.load() 的实现。

实现

assets/js/common/utils.js:

/**
 * 通过异步加载 html 块
 *
 * @param {string} htmlPath 所加载的 html 文件路径
 * @param {string} selector 目标选择器
 */
export function loadHtml(htmlPath, selector) {
  // 使用 Fetch API 异步获取 html 文件资源
  return fetch(htmlPath)
  	.then((res) => {
      // 将响应结果以文本的形式返回,返回结果作为参数传递给下一个 then 块
      return res.text()
    })
    .then((html) => {
      // 创建 DOM 解析器
      const parser = new DOMParser()
      // 将文本解析为 html 格式
      const doc = parser.parseForomString(html, 'text/html')
      // 通过 querySelector 获取介些后的 html 中的第一个 div
      const el = doc.querySelector('div')
      // 将 div 块追加到目标块中
      document.queryselector(selector).appendChild(el)
    })
}

注: 因代码中使用 querySelector 搜寻目标文件中的第一个 div 标签,所以公共部分的 html 文件中必须以 div 标签包含内容。

用例

index.html:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Demo</title>
  <script type="module" src="assets/js/common/common.js"></script>
</head>

<body>
  <header></header>

  <div id="content">
    Demo
  </div>

  <footer></footer>
</body>

</html>

layouts/header.html:

<div>
  Header
  <div class="header-content">
    header content
  </div>
</div>

layouts/footer.html:

<div>
  Footer
  <div class="footer-content">
    footer content
  </div>
</div>

assets/js/common/common.js:

import { loadHtml } from './utils.js'

/**
 * 公共部分事件添加
 */
 function eventsAdd() { //... }
 
/**
 * 渲染公共部分
 */
async function render() {
  await loadHtml('layouts/header.html', 'header')
  await loadHtml('layouts/footer.html', 'footer')
  // 待html渲染结束后,添加事件
  eventsAdd()
}

// 执行 render
render()

注: 因实现的 loadHtml 返回的是 Promise,渲染 html 是异步执行的,所以向引入的公共部分添加事件需等待公共部分渲染到页面完毕,即异步执行。