AJAX Hashbang的问题

时间:2014-01-02 13:36:55

标签: php jquery ajax codeigniter

我遇到了使用'hashbang'来跟踪通过AJAX加载了哪个页面的问题。

当单击链接时,会通过AJAX请求将内容加载到内容div中,URL的哈希值将更改为页面名称。例如,如果用户直接访问pageA( http://www.domain.com/pageA ),然后点击pageB的链接,则该网址将更改为 http://www.domain.com/pageA#/pageB < / p>

我正在为我的应用程序使用CodeIgniter,处理哈希更改的代码在我的标题视图中,它执行以下操作:

<script type="text/javascript">
    window.redirect = function() {
        if(window.location.hash.substring(0, 2) == "#!") {
            if(window.location.hash.substring(2).length > 2) {
                window.location = window.location.hash.substring(2);
            } else {
                return false;
            }
        }
        return false;
    }
    window.redirect();
</script>
<script type="text/javascript">
    $(function() {
        $(window).hashchange(function() {
            if(ajax_loading == true) {
                return false;
            } else {
                loadPage(window.location.hash.substring(2), 'internal', '');
            }
        });
    });
</script>

这有两个步骤。第一个检查是否通过刷新或输入URL直接访问页面时是否存在hashbang。如果有hashbang,则重定向到存储在哈希中的页面。

第二步检查哈希的更改,例如,按下后退按钮的用户喜欢这样做。

我的问题在于第一个块 - 当用户刷新或直接输入带有hashbang的URL时。

如果用户输入 http://www.domain.com/pageA#/pageB pageA 上的任何服务器端代码都将在窗口重定向之前运行 pageB < / p>

这会导致以下情况出现问题:

  1. 用户直接转到 pageA - pageA 将会话变量设置为“ abc
  2. 用户点击指向 pageB - pageB 的链接,然后将该会话变量设置为“ xyz ” - 该网址目前为 { {3}}
  3. 用户点击指向 pageC 的链接 - 会话变量仍设置为“ xyz ”且 pageC 不会更改此项 - 网址目前为 http://www.domain.com/pageA#/pageB
  4. 用户现在点击刷新。在重定向到 pageC 之前,首先执行 pageA - 但由于先执行了 pageA ,因此会话变量现已重新设置为' abc '应该是' xyz '。
  5. 由于在CodeIgniter控制器中加载了代码最后一点的视图 - 除了执行hashbang之前的页面代码之外,我不能在任何时候进行窗口重定向。

    是否有任何关于如何防止这种情况发生的想法?

1 个答案:

答案 0 :(得分:0)

只是不要将用户发送到http://www.domain.com/pageA#/pageC

您应该有一个唯一的页面,它不会设置任何会话变量,并通过AJAX加载其他页面。然后,用户永远不会直接转到pageA ,而是通过http://www.domain.com/index#/pageA

  1. 用户转到/ index#/ pageA - pageA将会话变量设置为'abc'
  2. 用户点击指向pageB的链接 - pageB然后将该会话变量设置为'xyz' - 该网址目前为http://www.domain.com/index#/pageB
  3. 用户点击指向pageC的链接 - 会话变量仍设置为'xyz',而pageC不会更改此内容 - 网址目前为http://www.domain.com/index#/pageC
  4. 用户现在点击刷新。在重定向到pageC之前首先执行index - 但由于index没有设置任何内容,因此会话变量现在仍然是'xyz'。
  5. 正如我假设您为自己提供了指向用户的链接,设置它应该没有问题。