javascript - 如何在 IE-11 上正确读取 $_SESSION?

标签 javascript php jquery jquery-ui internet-explorer

我正在处理一项尝试在 IE 上提交表单的任务:

1.- 当我在 page1.php 上并单击“提交”时,我会看到一个 jQuery UI 弹出对话框,然后单击“是的,我接受”,它会将我带到 page2.php,如果我单击“后退”按钮让我回到 page1.php

2.- 我还有一个名为“inProgress”的 php SESSION,当用户从 page1.php 转到 page2.php 时,它会分配一个值 1。这基本上意味着只要用户只点击一次“是的,我接受”按钮,用户就不应再显示弹出窗口(即使用户来回切换)。

问题:

a) 不知何故,当用户点击“提交”按钮(在 page1.php 上)时,弹出窗口显示并自动点击“是的,我接受”,但是即使我回去这是一件好事。不过,我更愿意自己点击“是的,我接受”按钮。

b) 主要问题是,即使我在使用 IE-11 时来回切换,我也会一直让弹出窗口显示(我只希望弹出窗口只显示一次)。

在 IE-11 上单击“是,我接受”后,如何让弹出窗口仅显示一次,或者换句话说,如何确保在 IE-11 上正确读取 session ?我考虑过将 cookie 与 javascript 一起使用,但不确定如何实现...请有人帮助我。非常感谢你!这是我的 page1.php 和 page2.php 代码

page1.php

<?php
session_start();
if ($_POST) {
$_SESSION['inProgress'] = "1";
header("Location: page2.php");
exit;
}
?>
<html>
<head>
<title>Page1</title>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
</head>
<body>
<form id="homeForm" name="homeForm" method = "POST">
<input type = "submit" id="btnOpenDialog" name = "submit">
<input type="text" id="inProgress" value="<?php echo $_SESSION['inProgress'] ?>"/>
</form>
<h1>This is Page 1</h1>
<div id="dialog-confirm"></div>
<script type="text/javascript">
$(document).ready(function(){
$("#btnOpenDialog").click(function(){
var inProgress = $('#inProgress').val();
if (inProgress !== "1") {
$("#dialog-confirm").dialog({
resizable: false,
modal: true,
title: "Title",
height: 250,
width: 350,
closeOnEscape: false,
buttons: {
  "Yes, I accept": function () {
    $('#homeForm').submit();
    },
    "No, thanks": function () {
      $(this).dialog('close');
    }
  }
  });
  }
 });
});
</script>
</body>
</html>

page2.php

 <html ng-app="store">
 <head>
 <title>Page1</title>
 </head>
 <body>
 <h1>This is Page 2</h1>
 <div id="dialog-confirm"></div>
 <script type="text/javascript">

 function myfunction() {
 window.location.href="page1.php";
 }

 </script>
 <input type="button" id="btnOpenDialog"  onclick = "myfunction()"   value="Back" />

</body>
</html>

最佳答案

Thnink 这不是浏览器问题(我们谈论的是 session ,它是只读的服务器端,在客户端你只需要 token 来识别你的 session )。

猜想当你返回时服务器代码没有被执行(浏览器缓存了页面并且只会加载 Assets 比如图像或javascript)。

您可以使用 localStorage 改进客户端检查的行为。有一些库可以写入 localStoragefallback浏览器的 cookies(如果您需要旧浏览器支持)像 SimpleStorage.js(在 github 中)。

使用 localStorage 会是这样的(我将使用 localStorage,没有后备库或包装库),只要单击 Yes I accept 按钮,您就可以了到 page2 存储一个标志:

$('#btnOpenDialog').on('click', function(){
   localStorage.setItem('dialogAccepted', 'true'); //you can string just strings, if you ever need to store comples data use JSON.stringify(variable) so it's parsed to json
})

然后在 page1 中,检查您已经在执行服务器端( session 之类的)并添加此客户端:

if(localStorage.getItem('dialogAccepted') === 'true'){
  //code to disable the dialog pop up
} 

解决“自动”点击:这不是自动点击,只是对话框没有阻止表单提交。你可以这样解决:

$(document).ready(function () {
    var preventedDefaultMet = false;
    $("#btnOpenDialog").on('click', function (event) {
        var inProgress = $('#inProgress').val();
        if (inProgress !== "1") {
            if (!preventedDefaultMet) {//so when the dialog was accepted we can trigger the click event and do not enter an infinite loop of dialogs
                event.preventDefault();//to prevent the browser from making the POST call
            }
            $("#dialog-confirm").dialog({
                resizable: false,
                modal: true,
                title: "Title",
                height: 250,
                width: 350,
                closeOnEscape: false,
                buttons: {
                    "Yes, I accept": function () {
                        preventedDefaultMet = true; // set flag
                        $('#homeForm').trigger('submit');//accepted! just trigger the click! yay!
                    },
                    "No, thanks": function () {
                        $(this).dialog('close');//trigger the click
                    }
                }
            });
        }
    });
});

只需混合我给您的两个答案,您就应该拥有您想要的行为。顺便说一下,不知道你是否出于某种原因执行了 $_SESSION['inProgress'] = "1";,但是你可以编写一些 javascript 并将该标志存储在浏览器内存中,就像这样:

<form id="homeForm" name="homeForm" method = "POST">
        <input type = "submit" id="btnOpenDialog" name = "submit">
        <input type="text" id="inProgress" value="<?php echo $_SESSION['inProgress'] ?>"/>
    </form>
<script>
   // when the browser reads this it will store the value PHP printed into the javascript variable
   var someJavaScriptVar = <? echo $_POST ? true : false ;?>;
</script>

这样您就不必执行 $_SESSION['inProgress'] = "1"; 并且 input 将具有用户输入的值。您必须将 if (inProgress !== "1") { 更改为 if (someJavaScriptVar) {。试一试。

关于javascript - 如何在 IE-11 上正确读取 $_SESSION?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36336240/

相关文章:

javascript - 将所有出现的 {{var}} 替换为值

php - 为什么我的动态添加的表单输入没有发布?

javascript - 在ajax中获取响应参数值

javascript - jquery 获取多个属性

javascript - 在 map 上显示位置

javascript - 浏览器后退按钮,div 被 css 隐藏

javascript - 谷歌图表工具提示不适用于移动设备

javascript - 将对象格式化为嵌套字段

php - MySQL 中的子选择

php - 尝试简化代码以获取 2 个表的结果,不包括表 1 中的一些结果和表 2 中的一些结果