docs: function hashChange(hash, option) {
    const self = this;
    /***
     * 转场的id(没有重复)
     * @type {string}
     */
    let id = "";
  
    if (hash) {
      id = hash.indexOf("?") !== -1
        ? hash.substring(1, hash.indexOf("?"))
        : hash.substring(1);
  
      const index = id.lastIndexOf("_");
      /***
       * 用户自定义的锚点跳转
       */
      if (index === -1) {
        return false;
      } else {
        const pageId = id.substring(0, index);
        /***
         * 用户自定义的锚点跳转
         */
        if (!window.document.querySelector("[data-ct-data-role='page'],#" + pageId)) {
          return false;
        }
        self.ctmobile.fireEvent(window.document, "pageBeforeChange", [CtMobileFactory.getUrlParam(hash)]);
      }
    }
    /***
     * 首页
     */
    else {
      self.ctmobile.fireEvent(window.document, "pageBeforeChange", [CtMobileFactory.getUrlParam(hash)]);
      if (/*如果栈顶元素的pageId == 模板中第一页的id*/
      self.ctmobile.getFirstPage().getPageId() === self.ctmobile.getFirstPageId()) {
        // 说明是从模板的第一页进入主应用的
        id = self.ctmobile.getFirstPage().getId();
      }
      else {
        // 不是从模板的第一页进入主应用的
        self.ctmobile.createPage(self.ctmobile.getId(self.ctmobile.getFirstPageId()), (Component) => {
          Component.start(Constant._SLIDEDURATION, () => {
            self.removeFirstPage();
          });
        });
        return;
      }
    }
  
    //hash ? (hash.indexOf("?") != -1
    //    ? id = hash.substring(1, hash.indexOf("?"))
    //    : id = hash.substring(1))
    //    : id = root.getFirstPage().getId();
  
    /***
     * 新的页面
     */
    const curPage = self.getPageById(id);
    if (!curPage) {
      self.ctmobile.createPage(id, (Component) => {
        Component.start(Constant._SLIDEDURATION, function () {
          // 如果不改变浏览器历史且历史栈长度大于1
          if (option && option.reload && self.getHistoryLength() > 1) {
            const preHistoryIndex = self.getHistoryLength() - 2;
            const preHistoryPage = self.getPageByIndex(preHistoryIndex);
            if (preHistoryPage) {
              preHistoryPage.finish(0, null, option);
            }
          }
        });
      });
    }
    /***
     * 回退
     */
    else {
      //  如果刷新的是栈顶的页面
      if (id === self.getLastPage().getId()) {
        return false;
      } else {
        // 依次出栈
        const index = self.ctmobile.indexOfById(id);
        for (let i = self.getHistoryLength() - 1; i > index; i--) {
          if (i === index + 1) {
            self.getPageByIndex(i).finish(Constant._SLIDEDURATION);
          } else {
            self.getPageByIndex(i).finish(0);
          }
        }
      }
    }
  }