AngularJS 实现 SPA 时如何兼容 IE8

阅读时长 11 分钟读完

AngularJS 实现 SPA 时如何兼容 IE8

Vue.js, React.js, AngularJS 等前端框架的出现,让前端的开发效率大大提高,并且实现了单页应用(Single-Page Application,以下称 SPA)的概念。SPA 的优点可谓是显而易见的,但是 IE8 以下的版本并不支持 HTML5 相关的一些属性和方法,如 HTML5 中新增的视频、音频、canvas 等标签,以及 History API。当然,还有 AngularJS 中使用到的一些 api。本文将介绍 SPA 中如何兼容 IE8,以 AngularJS 为例。

首先,针对 IE8 中不支持的 HTML5 标签我们可以通过 Modernizr 来判断浏览器是否支持该标签,如下:

-- -------------------- ---- -------
---- ---------- ---
--------- -----
----- ----------
------
  ----- ----------------
  ---------------- ------------
  ------- -----------------------------------------------------------------
  ------- ------------------------------------------------------------------
-------
----- ---------------
  ------ ------------------------ ---------------- ----------- ------------ -----------------
  ---- ------------------------
    ------ ---- ------- ---- --- ------- ----- ------
  ------
  ------- ----------------------
-------
-------

在 Modernizr 加载完毕后,我们可以使用 Modernizr 对象中的属性来判断浏览器是否支持特定的 HTML5 API。

在 AngularJS 程序中,IE8 中不支持的 API 会出现在跨浏览器兼容性问题中。常见的有 event.target、event.currentTarget、event.preventDefault()、Array.indexOf()、String.trim() 、Object.keys() 等。

针对 Array.indexOf()、String.trim()、Object.keys() 我们可以使用如下的 polyfill:

-- -------------------- ---- -------
-- -------- --- ---------------
-- -------------------------- -
  ----------------------- - -------- ----- ---------- -
    -- ---------- --- ----- -
      --------- - --
    - ---- -- ---------- - -- -
      --------- - ----------- ----------- - -----------
    - ---- -
      --------- - ------------------- ----------- - ---
    -
    --- ---- - - ---------- - - ------------ - - -- ---- -
      -- -------- --- ---- -
        ------ --
      -
    -
    ------ ---
  --
-
-- -------- --- -------------
-- ------------------------ -
  --------------------- - -------- -- -
    ------ -------------------------- ----
  --
-
-- -------- --- -------------
-- -------------- -
  ----------- - --------- -- -
    ---- --------
    --- -------------- - --------------------------------
        -------------- - --- --------- ---- ------------------------------------
        --------- - -
          -----------
          -----------------
          ----------
          -----------------
          ----------------
          -----------------------
          -------------
        --
        --------------- - -----------------
    ------ -------- ----- -
      -- ------- --- --- -------- -- ------- --- --- ---------- -- --- --- ------ -
        ----- --- ---------------------- ------ -- -------------
      -
      --- ------ - --- ----- --
      --- ----- -- ---- -
        -- ------------------------- ------ -
          ------------------
        -
      -
      -- ---------------- -
        --- -- - -- - - ---------------- ---- -
          -- ------------------------- -------------- -
            --------------------------
          -
        -
      -
      ------ -------
    --
  -----
-

但是,这些 polyfill 可能会增加应用体积,影响速度,所以我们要尽可能的减少它们的引用。一般情况下,我们只需要在针对具体问题时再引用即可,这样就可以减少体积的影响了。

对于 IE8 中不支持的各种事件和 API,我们可以通过一个叫做 es5-shim 的库来解决。es5-shim 是一个由多位数前端大牛开发的 JavaScript 库,它可以将各种新的 JavaScript 标准方法(ES5 标准)实现在 IE 浏览器上,这样我们就能够在 IE 浏览器上愉快地使用这些新的 JavaScript 标准方法了。它包括 array.forEach(), Array.indexOf(), Object.create(), Object.defineProperty(), Function.prototype.bind(), JSON.parse(), JSON.stringify() 等。

以下为 es5-shim 的引用:

-- -------------------- ---- -------
---- ---------- ---
--------- -----
----- ----------
------
  ----- ----------------
  ---------------- ------------
  ------- -----------------------------------------------------------------
  ------- ----------------------------------------------------------------
-------
----- ---------------
  ---- -----------------------
    -- -------------------
    ------- -----------------------------------
  ------
  ------- ----------------------
-------
-------

在上面的例子中,我们在 index.html 文件的头部引入了 es5-shim。需要执行的函数我们可以参考 es5-shim 的官方文档,然后按需使用。

针对 IE8 不支持 History API 的问题,我们需引用一个名为 html5shiv.min.js 的 polyfill 库,对于 AngularJS 应用的路由,默认情况下,只支持 HTML5 标准的 History API,如果你的应用需要兼容到 IE8 及以下版本的浏览器,需要引用 html5shiv.min.js 库。

-- -------------------- ---- -------
---- ---------- ---
--------- -----
----- ----------
------
  ----- ----------------
  ---------------- ------------
  ------- -----------------------------------------------------------------
  ------- -- -- ---
    ------- ------------------------------------------------------------
  ------------
-------
----- ---------------
  ---- -----------------------
    -- ----------------------
    -- -------------------- ------
    ---- --------------
  ------
  ------- ----------------------
-------
-------

在上面的例子中,我们在 index.html 文件的头部使用了条件注释,对 IE8 及其以下浏览器,加载了 html5shiv.min.js。

当然,以上方法都只是在尽量减少不支持 API 对代码的影响,但是可能并不能解决所有的兼容性问题,所以我们还需要在其他方面继续学习、总结和优化,来减少不必要的兼容问题。

最后,提供一个 AngularJS 实现的 SPA 兼容 IE8 及以上版本的完整代码 (主要是 router 和 controller 的定义)

-- -------------------- ---- -------
-- ------
----------------------- ------------
---------------- ---------------- ------------------ -
  --------------
    -------------- -
      ------------ ------------
      ----------- ----------
    --
    --------------- -
      ------------ -------------
      ----------- -----------
    --
    ------------
      ----------- -------
    ---
    -----------------------------
      -------- -----
      ------------ -----
    ---
--
----------------------- -------- -------- ---------- ------ -
  ------------ - ----- ------
  ----------------------
    ----------------- ------ -
      ----------- - -----
    --
    --------------- -- -
      ------------------- -- ----- ---- --------
    ---
  --------------- - -------- -- -
    ----------- -------- ----------
  --
--
------------------------ -------- -------- ---------- ------ -
  ------------ - ------ ----
  -----------------------
    ----------------- ------ -
      ----------- - -----
    --
    --------------- -- -
      ------------------- -- ----- ----- --------
    ---
  --------------- - -------- -- -
    ----------- -------- ----------
  --
---

参考资料:

  1. https://modernizr.com/docs
  2. https://github.com/es-shims/es5-shim
  3. https://docs.angularjs.org/api/ngRoute/service/$route
  4. https://docs.angularjs.org/api/ng/provider/$locationProvider

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f39808f6b2d6eab3cf0c0e

纠错
反馈