如何在IE-11上正确阅读$_SESSION
How to read a $_SESSION properly on IE-11?
我正在处理一项任务,试图在IE:上提交表单
1.-当我在page1.php上点击"提交"时,我会弹出jQuery UI对话框,然后我点击"是的,我接受",它会带我回到page2.php,如果我点击"返回"按钮,它会让我回到page1.php
2.-我还有一个名为"inProgress"的php SESSION,当用户从page1.php转到page2.php时,它会被赋值为1。这基本上意味着,只要用户只点击一次"Yes I accept"按钮,用户就不应该再显示弹出窗口(即使用户来回移动)。
问题:
a) 不知怎的,当用户点击"提交"按钮(在page1.php上)时,弹出窗口会显示,并自动点击"是的,我接受",但即使我回去了,我也不会再弹出窗口,这是一件好事。但是,我更愿意自己点击"是的,我接受"按钮。
b) 主要的问题是,即使我在使用IE-11时来回切换,我也会不断地显示弹出窗口(我只希望弹出窗口只显示一次)。
在IE-11上单击"Yes I accept"(是,我接受)后,我如何才能让弹出窗口只显示一次,或者换句话说,我如何确保IE-11上正确阅读了会话?我曾想过将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这不是浏览器问题(我们谈论的是会话,即只读服务器端,在客户端上,您只需要使用令牌来识别会话)。
猜测当你返回时,服务器代码没有被执行(浏览器缓存了页面,只会加载资产,如图像或javascript)。
您可以使用localStorage
改进执行客户端检查的行为。对于旧的浏览器(如果您需要旧的浏览器支持),如SimpleStorage.js
(在github中),有一些库可以通过回退到cookies
来写入localStorage
。
使用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
中,检查您已经在服务器端(会话)进行的操作,并添加以下客户端:
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";
,输入将具有用户输入的值。您必须将if (inProgress !== "1") {
更改为if (someJavaScriptVar) {
。试一下。
在第1页上,您的函数在加载时自动运行,而不是等待用户操作。您可以将<input type = "submit" id="btnOpenDialog" name = "submit">
更改为普通按钮,然后触发您的功能。
它可能看起来像这样:
<?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 = "button" id="btnOpenDialog" name = "submit" onclick="yourfunctionABC()">
<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">
function yourfunctionABC(){
xxx}
您是否也在检查会话是否已设置?可能看起来像:
if(session_id() == '' || !isset($_SESSION)) {
session_set_cookie_params(3600, '/', '.example.com');
// session isn't started
session_start();//create unique session for user
}
你真的重置了第二页上的会话变量吗?如果没有,会话变量将一直保持设置状态,这就是为什么不会显示其他弹出窗口的原因。
希望能有所帮助。
- 后焦点更改为IE 11中的地址栏,而不是转移到表单中的下一个控件
- Asp自定义验证器在IE-11中不起作用
- javascript中的SVG转换在IE 11中不起作用
- AngularJS+IE 11+聚合物=ng模型未更新
- 无法获取属性'字符串'的未定义或null引用IE 11 ASP.NET
- IE 11未在SVG地图上启动Mouseenter或Mouseleave事件
- angularjs formly submit bug in safari & IE 11
- 从IE 11中的HTTP URL下载blob
- SPA异步调用在IE 11中不起作用
- 如何使用 JavaScript 或 PHP 将 IE 11 企业模式设置为标准模式
- 将 JSON 下载为文件:IE-11 抛出 414 请求 URI 太大
- Formdata 和 XMLhttpRequest 在 IE 11 上不起作用
- 如何在 IE 11 中删除图像映射中的虚线
- IE 11 中的 PDF 查看器与顶部下拉滚动条重叠
- Angular JS错误:仅在IE 10和IE 11中出现[$rootScope:infdig]
- 如何使用IE 11和Firefox 36调试StealJS
- 绑定'滚动'不会'我在IE 11中不工作
- 为什么这会在IE 11中引发异常
- Javascript with IE 11 issue
- IE 11没有显示“;显示内容"弹出消息