2009-06-23 14 views
1

location.hash scheint in Safari 4 völlig kaputt zu sein: Er kann initial gesetzt werden, kann aber auf keinen Fall so weit festgelegt werden, wie ich feststellen kann, ob dieses Ereignis von einem Benutzer ausgelöst wird Aktion oder ein Timer.location.hash Oddness in Safari 4

Hier ist ein Beispiel (ich der Kürze halber jQuery hier, aber ich kann mir nicht vorstellen, dass dieses Problem jQuery-spezifisch):

<!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> 

In Firefox, das Verhalten ist das, was man erwarten würde: Wenn Wenn Sie die Seite laden, wird der Hash auf #normal gesetzt. Wenn Sie auf den Link klicken, wird der Text fett und der Hashwert wird auf #bold festgelegt. Da der Hashwert geändert wurde, hat die Intervallfunktion keine Auswirkung. Wenn Sie den Hash in der Adressleiste zu etwas anderem ändern (das nicht in bold endet), wird der Text nicht fett formatiert. Dadurch kann die Zurück-Schaltfläche intuitiv arbeiten: Klicken Sie zurück, wo der Hash #bold ist, und der Text wird fett formatiert. Klicken Sie an eine beliebige Stelle, und der Text ist nicht fett.

Aber in Safari 4 ist das Verhalten: Wenn Sie die Seite laden, wird der Hash auf #normal gesetzt. Und dann wird es für immer so bleiben, was die Adressleiste angeht. Wenn Sie auf den Link klicken, wird der Text fett dargestellt und bleibt auch dann erhalten, wenn sich der Hash in der Adressleiste nicht geändert hat. So wird location.hash intern geändert (wie der hashValue Absatz widerspiegelt). Diese Inkonsistenz mit der Adressleiste hat schlimme Folgen: Wenn Sie auf die Zurück-Schaltfläche klicken, wird der Text nicht fett; aber wenn du danach auf den Vorwärts-Button klickst, wird es nicht wieder fett! Dadurch werden JavaScript-Historienbibliotheken wie die jQuery history plugin vollständig zerstört.

Irgendwelche Korrekturen? Irgendwelche Problemumgehungen? Ich habe das in Safari 4.0.1 auf einem Mac getestet.

+0

Funktioniert für mich (Safari 4.0.1 Mac). Sie möchten einen Link zu einer Version veröffentlichen, die nicht funktioniert? – Miles

Antwort

1

Es stellt sich heraus, dass dies überhaupt nicht um einen Fehler in Safari war, sondern in Glims, ein Plugin Ich war mit: http://www.machangout.com/

das Plugin das Problem behoben entfernen. Ich hielt dies nicht für eine Möglichkeit, da ich keine Ahnung hatte, warum Glims sich mit der Interaktion von JavaScript mit der Adressleiste herumschlagen würde.

Neuinstallation der neuesten Build, scheint es nicht von diesem Problem zu leiden.

0

Können Sie stattdessen so etwas tun?

window.location.replace(new_location);