Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php AJAX Hashbang的问题_Php_Jquery_Ajax_Codeigniter - Fatal编程技术网

Php AJAX Hashbang的问题

Php AJAX Hashbang的问题,php,jquery,ajax,codeigniter,Php,Jquery,Ajax,Codeigniter,我在使用“hashbang”跟踪通过AJAX加载的页面时遇到了一个问题 当单击一个链接,该链接通过AJAX请求将内容加载到content div中时,URL的散列将更改为页面名称。例如,如果用户直接访问pageA(),然后单击pageB的链接,则URL将更改为 我正在为我的应用程序使用CodeIgniter,处理哈希更改的代码在我的头视图中,它执行以下操作: <script type="text/javascript"> window.redirect = function(

我在使用“hashbang”跟踪通过AJAX加载的页面时遇到了一个问题

当单击一个链接,该链接通过AJAX请求将内容加载到content div中时,URL的散列将更改为页面名称。例如,如果用户直接访问pageA(),然后单击pageB的链接,则URL将更改为

我正在为我的应用程序使用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>

window.redirect=函数(){
if(window.location.hash.substring(0,2)=“#!”){
if(window.location.hash.substring(2).length>2){
window.location=window.location.hash.substring(2);
}否则{
返回false;
}
}
返回false;
}
window.redirect();
$(函数(){
$(窗口).hashchange(函数(){
if(ajax\u加载==true){
返回false;
}否则{
loadPage(window.location.hash.substring(2),'internal','';
}
});
});
这有两个步骤。第一种方法是通过刷新或输入URL等方式检查直接进入页面时是否存在hashbang。如果存在hashbang,则重定向到存储在hash中的页面

第二步检查对散列的更改,例如,它捕捉到用户按下后退按钮的情况

我的问题是第一个块——当用户刷新或直接用hashbang输入URL时

如果用户输入,则在窗口重定向到pageB之前,pageA上的任何服务器端代码都将运行

这会在以下情况下导致问题:

  • 用户直接转到pageA-pageA将会话变量设置为“abc”
  • 用户单击指向pageB的链接-pageB然后将该会话变量设置为“xyz”-URL当前为
  • 用户单击指向pageC的链接-会话变量仍设置为“xyz”,pageC不会更改此设置-URL当前为
  • 用户现在点击刷新。pageA在重定向到pageC之前首先执行-但由于pageA是首先执行的,会话变量现在已被设置回“abc”,而此时它应该是“xyz”
  • 由于在CodeIgniter控制器中的代码的最后一点加载视图,所以除了在hashbang执行之前的页面代码外,我无法在任何点执行窗口重定向

    有人知道如何防止这种情况发生吗?

    只是不要将用户发送到

    您应该有一个不设置任何会话变量的唯一页面,并通过AJAX加载其他页面。然后用户再也不会直接进入pageA,而是通过

  • 用户转到/index#/pageA-pageA将会话变量设置为“abc”
  • 用户单击指向pageB的链接-pageB然后将该会话变量设置为“xyz”-URL当前为
  • 用户单击指向pageC的链接-会话变量仍设置为“xyz”,pageC不会更改此设置-URL当前为
  • 用户现在点击刷新。在重定向到pageC之前,首先执行index-但由于index没有设置任何内容,会话变量现在仍然是“xyz”

  • 我假设您为自己提供了指向用户的链接,设置它应该没有问题。

    这不是hashbang的问题,当然是您如何控制应用程序中的页面的问题?为什么要这样处理页面加载?这是使用hashbang时出现的一个问题。我的问题是如何以类似的方式处理页面加载,但不会遇到我遇到的问题。这些问题很多,而不是使用哈希,但较旧的浏览器可能会有一些问题(你可以使用它来达到标准)。然而:如果
    GET
    -根据您以前访问过的页面,对某个页面进行排序会产生不同的结果,在我看来,这是一个设计缺陷。手动从pageA切换到pageC也会遇到同样的问题,因此,在这种情况下也应该解决。@Wrikken问题是我们需要支持不支持HTML5的浏览器,例如旧版本的IE。当你说
    时,手动从pageA切换到pageC也会遇到同样的问题
    -你不会。pageA将会话设置为
    abc
    ,pageC将在
    abc
    上获取该值-没有问题!如果加载
    pageA#pageC
    ,就会发生这种情况。。。所以,要么这是你想要的行为,要么不是,你不需要散列中的一个页面,而是一条线索?(
    pageA#pageB/pageC
    或类似的东西。)或者,如果
    pageA
    知道
    pageB
    ,并且只将变量设置为
    abc
    ,如果它还没有
    xyz
    ,这在这种情况下也可以工作,但会使url无法书签(因此,在我看来,如果在
    GET
    请求中使用,则会被破坏)。