在Safari 4中,

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

在Firefox中,行为是您所期望的:当您加载页面时,哈希设置为#normal。单击该链接时,文本将变为粗体,并且哈希值将设置为 #bold 。由于哈希值已更改,因此间隔函数无效。如果您将地址栏中的哈希更改为其他内容(不以 bold 结尾),则文本将以非粗体显示。这使得后退按钮可以直观地工作:单击返回哈希 #bold 的位置,文本变为粗体。点击其他任何地方,文字都是非粗体。

但在Safari 4中,行为是:加载页面时,哈希设置为#normal。就地址栏而言,它将永远保持这种状态。单击该链接时,即使地址栏中的哈希值未更改,文本也将变为粗体,并保持这种状态。因此,location.hash在内部更改(因为 hashValue 段落反映)。与地址栏的这种不一致会带来可怕的后果:如果单击后退按钮,则文本将不加粗体;但如果在此之后单击前进按钮,则不会重新加粗!这完全打破了JavaScript历史库,例如 jQuery历史插件

任何修复?任何解决方法?我在Mac上的Safari 4.0.1中对此进行了测试。

)) { $('#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历史插件

任何修复?任何解决方法?我在Mac上的Safari 4.0.1中对此进行了测试。

有帮助吗?

解决方案

事实证明,这根本不是Safari中的错误,而是Glims,我使用的插件: http://www.machangout.com/

删除插件修复了问题。我不认为这是一种可能性,因为我不知道为什么Glims会混淆JavaScript与地址栏的交互。

重新安装最新版本,似乎不会遇到这个问题。

其他提示

你可以这样做吗?

window.location.replace(new_location);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top