2

我在 JQM 中运行一个动态页面生成器,并且正在努力让它正常工作。

当用户单击链接时,我会changePage像这样拦截调用:

  ...
  .on("pagebeforechange", function (e, data) {
    if (typeof data.toPage === "string") {
      init.parsePage(util.parseLink(data.toPage), true);
      e.preventDefault();
    }
  })

这将调用我的parsePage方法,该方法生成一个新页面,初始化并将其附加到 DOM,如下所示:

  $(document).enhanceWithin();
  $.mobile.initializePage();
  // go to the new page
  $.mobile.changePage("#" + config.id);

我的问题是,使用e.preventDefault()和新的 changePage 调用将pagebeforechange再次被我的监听器捕获并永远循环。我还尝试不阻止初始 changepage 调用并仅修改data.toPage参数,但是我的页面组装需要“太长时间”并且无法延迟 JQM 直到组装页面。

问题:
我如何触发一个没有被我的听众“抓住”或更好的新转换,我如何延迟 JQM 转换直到一切准备就绪(在这里有承诺会很好:-)

谢谢!

4

1 回答 1

0

我目前的工作(不满意)解决方案:

  // generate dynamic pages
  .on("pagebeforechange", function (e, data) {
    var page;

    if (typeof data.toPage === "string") {
      page = document.getElementById(data.toPage.replace("#",""));

      if (page || data.toPage === $.mobile.getDocumentUrl()) {
        return;
      }
      init.parsePage(util.parseLink(data.toPage), true);
      e.preventDefault();
    }
  })

所以我正在检查页面是否在 DOM 中,因为当我动态生成页面时,它将在更改页面之前被注入到 DOM 中。这样,在第一个 pagebeforechange 上,该页面不存在,因此将生成它,而在第 2 轮它将在 DOM 中,因此 I return.

这方面的问题:

  • 回到第一页总是会在 DOM 中找到一个页面(当它不应该时停止转换)或触发生成一个新页面,当第一页 URL 是/. 可以通过比较data.toPage(例如 localhost/app/)与 $.mobile.getDocumentUrl() 来解决(文档的 URL - 请记住,您总是停留在您加载的第一个 DOM 中,因此是 documentUrl)。这允许识别第一页。
  • pagebeforechange也会在弹出窗口打开时触发,所以这也不能触发转换。检查options.role
  • 如果 data.toPage 不是完整的 URL 怎么#foo办?
于 2013-10-24T10:04:21.953 回答