jquery ajax 请求后的刷新命令破坏了 Firefox 中的脚本

A refresh command after a jquery ajax request is breaking the script in Firefox

事情是这样的:我正在开发一种系统,可以在点击某个项目后更新网站的语言。它在 Chrome 和 Internet Explorer、桌面 (Windows 8.1) 或移动设备上运行良好,但在 Firefox(桌面和移动设备)上它不起作用,如果我有任何类型的命令来刷新页面。如果我删除命令并自己刷新页面,它只适用于 firefox。

我依赖于会话变量,所以我需要刷新,对吗?

这是目前的样子:

<head>
    <script type="text/javascript" src="../scripts/global/jquery-2.1.3.min.js"></script>
    <script>
        $(document).on("click",".button",function(){
            var language = $(this).attr("id");
            $.post("changeLanguage.php", {"language": language});
        });
    </script>
</head>
<body>
    <a class="button" id="en">en</a>
    <a class="button" id="de">de</a>
    <a class="button" id="pt">pt</a>
    <br>
    <span id="test">
        <?php 
            if (isset($_SESSION["displayLanguage"]))
            {
                echo $_SESSION["displayLanguage"];
            }
            else
            {
                echo $_SESSION["browserLanguage"];
            } 
        ?>
    </span>
</body>

我试过刷新:

location.reload();
location.reload(true);
window.location.href=window.location.href;
history.go(0);

并且所有内容都会破坏 firefox 中的脚本,但不会破坏其他脚本。

我没有想法,但我对此很陌生,所以我希望你们能提供帮助。

提前致谢。

编辑:更新:仔细检查后发现页面确实在刷新,但 <span> 内容没有更新,所以问题一定是 firefox 中的某些东西没有让 php 代码再次 运行,而不是破坏脚本。

编辑:更新 2 即使页面按照脚本的指示自行刷新,常规刷新也不会更新 <span> 内容,所以我不得不假设它不会破坏整个脚本,但至少 .post 更新会话变量的请求似乎在存在刷新请求时不起作用。

我认为问题出在您尝试刷新时。您应该等待 $.post() 的成功。 (未经测试,如有问题请评论)

<head>
    <script type="text/javascript" src="../scripts/global/jquery-2.1.3.min.js"></script>
    <script>
        $(document).on("click",".button",function(){
            var language = $(this).attr("id");
            $.post("changeLanguage.php", {"language": language})
            .error(function(jqXHR, errorStr){
                console.log("Ajax Error: " + errorStr);
                return false;
            })
            .done(function(){
                alert("Success - Reloading.");
                location.reload();
            })
            .fail(function(){
                console.log("Ajax Failed.");
                return false;
            });
        });
    </script>
</head>
<body>
    <a class="button" id="en">en</a>
    <a class="button" id="de">de</a>
    <a class="button" id="pt">pt</a>
    <br>
    <span id="test">
        <?php 
            if (isset($_SESSION["displayLanguage"])) {
                echo $_SESSION["displayLanguage"];
            } else {
                echo $_SESSION["browserLanguage"];
            } 
        ?>
    </span>
</body>

此外,我建议使用 FireBug。此附加组件允许您将控制台日志设置为 Persist。我发现这对 AJAX 测试非常有价值。通常失败的 Ajax 会导致 Link 执行。因此,您可能无法捕获错误或无法在控制台中显示。让它持久化将允许它执行并仍然获得控制台注释。