【发布时间】:2012-02-10 15:35:48
【问题描述】:
我有一个涉及 PHP、Ajax 和 IE 的奇怪错误。
我的网站设置方式是根页面将通过 jQuery 的 $.ajax 基于 URL 的哈希标记动态加载内容。所以http://example.com/#message/ 会加载一个页面来发送消息。标准的东西。
在提交此消息表单时,我将哈希标记附加到 POST 请求,以便我可以将用户发送回他们来自的页面。在这个消息传递示例中,我将在服务器端收到$_POST['page'] = "message/"。到目前为止效果很好。
我将处理请求,然后将用户发送回页面。这就是问题的开始。
我在我的 PHP 脚本中所做的是:
$_SESSION['sent'] = true;
header('Location: '. rootUrl() .'/#'. $_POST['page']);`
(在这种情况下,rootUrl() 返回“http://example.com”,因此字符串连接到“http://example.com/#message/”)
这会将我返回到用户之前所在的同一消息页面,脚本类似于:
if (isset($_SESSION['sent'])) {
echo '<p>Your message was sent!</p>';
} else {
// show the message submit form here
}
// fully clear so the user can reload the page and send another message
unset($_SESSION['sent']);
现在整个场景在除 IE 之外的所有浏览器中都能完美运行,确实在非 ajax 版本的所有浏览器中都能完美运行(ajax 功能是通过渐进增强添加的,非 ajax/ajax页面是 100% 相同的)。
那么在 IE 中会发生什么?它两次加载带有井号标签的页面!它向页面发送两个请求。
这是一个问题,因为我正在取消设置我的 $_SESSION['sent'] 变量,所以用户体验是他们点击发送,然后他们的消息似乎会自行清除。它确实在服务器端处理和发送,但用户无法知道。
这发生在所有版本的 IE 中,或者至少从 IE9 及以下版本中发生。
作为临时修复,我刚刚决定将标头重定向到页面的非 ajax 版本,这可以按预期工作。
这是一个小问题:过渡不太顺畅,但随后点击该网站将恢复 ajax 功能。但是,我仍然想知道为什么 IE 会加载我的页面两次。
我发现与该问题稍有关联的是,在 IE 中,带有空 'src' 属性的 img 标签会向根页面发送请求,但我的页面上只有一个 img 标签,它是不是空的。所以我认为这不是问题。
【问题讨论】:
-
@Corey 你在哪里调用 session_start()?是否有可能您的 SESSION 变量未在 IE 中设置?
-
@Ben session_start() 位于每个页面的顶部,并且 SESSION 变量工作正常。我测试这个理论的一种方法是在那个区域使用
<p>标签,我在暂停 UI 之后放置了一个 Javascriptalert()。在除 IE 之外的所有浏览器中,它都会显示<p>标记的内容,显示警报并完成。在 IE 中,它显示内容、警报,然后在退出对话框时,页面重新加载。我还通过服务器日志验证了 IE 两次点击该页面。所以我知道 PHP 脚本的那部分是由 IE 调用的,它只是被取消设置和重新加载。 -
@Corey 可能与哈希标签有关吗?也许重定向到带有 GET 参数集的页面,然后调用 JavaScript sn-p 来添加哈希标记?看这里..stackoverflow.com/questions/2602260/…
-
@Ben 谢谢你的帖子!我想我知道现在的问题是什么:我的 ajax 请求设置了 window.location.hash。如果这是问题所在,我可以想一个简单的一行来解决它,让我试试。
标签: php jquery ajax internet-explorer