【问题标题】:How to handle page change errors in jQuery Mobile如何在 jQuery Mobile 中处理页面更改错误
【发布时间】:2011-09-20 12:06:56
【问题描述】:

我正在编写一个需要用户身份验证的 jQuery Mobile 应用程序。同一个用户不能从多个位置打开她的会话:如果用户从另一个浏览器登录,则前一个会话被标记为死。

如果用户尝试使用已死会话的浏览器移动到另一个页面,则会显示“加载页面错误”消息。这很糟糕,因为用户可能不知道她为什么会收到此错误。是否可以利用错误事件,以便我可以检查会话的状态并在会话已死时将用户重定向到登录页面?

【问题讨论】:

    标签: jquery-mobile


    【解决方案1】:

    怎么样

    pagechangefailed
    

    事件?

    页面加载失败时触发,似乎是这样。

    更多信息http://jquerymobile.com/test/docs/api/events.html

    【讨论】:

    • 是的,这在最近的版本中可用。但是,我在 9 月份遇到了这个问题,当时还没有实施。在我自己的回答中,我描述了 pageloadfailed 事件。显然 pagechangefailed 也足够了。
    【解决方案2】:

    相关:

    你可以使用类似的东西

    pagebeforeshow

    在正在显示的页面上触发,在其转换开始之前。

    示例(伪代码):

    $('#pageId').live('pagebeforeshow',function(event, ui){
        // check session here
        if(!$session) {
            // redirect to login
            $.mobile.changePage('#login');
        }
    });
    

    【讨论】:

    • 这是一个更好的解决方案。但是,这仍然感觉有点矫枉过正。我正在考虑做一个 jQuery Mobile 的分支并添加一个可订阅的错误事件,这样我只能在错误发生时处理它。然后过早的优化又是危险的,所以也许我现在会接受你的建议。 :)
    • 这毕竟没有帮助。如果页面加载失败,则不会触发 pagebeforeshow 和 pagebeforehide 事件。
    • 我的下一个建议是使用 AJAX 并检查 Apache 响应,例如:如果您收到 200 响应,那么您很好,否则......可能需要映射更多响应,因为这是只是一个概念
    • 或者让 AJAX 请求页面并让后端(如 PHP)验证会话,如果无效,则使用 PHP 发送所需的 URL 作为响应。示例:AJAX 请求 secure.php 页面,PHP 检查会话,如果会话良好则返回 secure.php 否则返回 login.php
    【解决方案3】:

    我最终派生了 jQuery Mobile 并添加了添加自定义错误处理程序的功能:https://github.com/jquery/jquery-mobile/pull/2504 我认为这优于其他建议,因为它不会增加任何开销,除非实际发生错误。

    更新:jQuery Mobile RC1 中将会有一个新的 pageloadfailed 事件。这将根据项目标准优雅地解决这个问题。

    【讨论】:

      【解决方案4】:
      $(a).click(function(){
          // check for session?
      });
      

      【讨论】:

      • 这是解决问题的一种方法,但可能有点过分。这将使请求数量(大约)翻倍,并且由于该应用程序主要在移动设备上使用,这可能会成为一个值得注意的问题。