IE加载一个页面两次,有没有办法解决这个问题?

时间:2012-01-15 03:48:20

标签: php jquery ajax internet-explorer

我有一个涉及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标签,而且它是不是空的。所以我认为这不是问题所在。

1 个答案:

答案 0 :(得分:0)

感谢评论中列出的thread Ben,我发现了这个问题。它与我的PHP脚本或ajax调用无关。

在我的ajax脚本中,当我加载新页面时,我还设置了window.location.hash。在普通浏览器中,所有这一切都会更改附加到地址栏中URL的哈希值。 IE将其视为您正在修改触发页面加载的window.location

solution:将window.location.hash = window.location.hash添加到页面的最顶部。这个仍然导致IE上的两个页面加载,但至少动态加载的包含将起作用。