我有一个涉及PHP,Ajax和IE的奇怪错误。
我的网站设置方式是根页面将根据URL的哈希标记通过jQuery的$.ajax
动态加载内容。因此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标签,而且它是不是空的。所以我认为这不是问题所在。