location.hash似乎完全被破坏了:它可以在最初设置,但在任何情况下都无法设置,无论该事件是由用户操作还是计时器触发。
这是一个例子(我在这里使用jQuery是为了简洁,但我无法想象这个问题是特定于jQuery的):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- Include jQuery -->
</head>
<body>
<div id="test">Click the link below to make this text bold.</div>
<p><a href="#test">Bold it!</a></p>
<p id="hashValue"></p>
<script>
$(document).ready(function() {
location.hash = '#normal'; // this works in all browsers
$('a').click(function() {
$('#test').css({'font-weight': 'bold'});
location.hash = '#bold'; // this fails in Safari 4
return false; // prevents link href from affecting hash
});
setInterval(function() {
if (! location.hash.match('bold$')) {
$('#test').css({'font-weight': 'normal'});
}
$('#hashValue').html(location.hash);
}, 100);
});
</script>
</body>
</html>
在Firefox中,行为是您所期望的:当您加载页面时,哈希设置为#normal。单击该链接时,文本将变为粗体,并且哈希值将设置为#bold
。由于哈希值已更改,因此间隔函数无效。如果您将地址栏中的哈希更改为其他内容(不会以bold
结尾),则文本将以非粗体显示。这使后退按钮可以直观地工作:单击返回哈希为#bold
的位置,文本变为粗体。点击其他任何地方,文字都是非粗体。
但在Safari 4中,行为是:加载页面时,哈希设置为#normal。就地址栏而言,它将永远保持这种状态。单击该链接时,即使地址栏中的哈希值未更改,文本也将变为粗体,并保持这种状态。因此,location.hash在内部更改(因为hashValue
段落反映)。与地址栏的这种不一致会带来可怕的后果:如果单击后退按钮,则文本将不加粗体;但如果在此之后单击前进按钮,则不会重新加粗!这完全打破了JavaScript历史库,例如jQuery history plugin。
任何修复?任何解决方法?我在Mac上的Safari 4.0.1中对此进行了测试。
答案 0 :(得分:1)
事实证明,这根本不是Safari中的错误,而是Glims,我使用的插件: http://www.machangout.com/
删除插件修复了问题。我不认为这是一种可能性,因为我不知道为什么Glims会混淆JavaScript与地址栏的交互。
重新安装最新版本,似乎不会遇到这个问题。
答案 1 :(得分:0)
你可以这样做吗?
window.location.replace(new_location);