6

Ich verwende Ajax, um den Speicherort einer Seite in einem Frame zu aktualisieren. Beim Festlegen des Speicherorts des Hashes (in Chrome und einigen Versionen von IE (5.5) speziell, aber gelegentlich in IE7) wird die Seite neu geladen.Einstellen von location.hash in Frames

Das folgende HTML demonstriert das Problem.

der Hauptrahmen .... frame.html ist

<html><head> 
<frameset rows="*"> 
<frame src=sethash.html frameborder=0 scrolling=auto name=somebody> 
</frameset> 
</head></html> 

die sethash.html Seite.

<html><head> 
<script language=JavaScript> 
var Count = 0; 
function sethash() 
{ 
    top.document.location.hash = "hash" + Count; 
    Count++; 
} 
</script> 
</head> 
<body onload="alert('loaded')"> 
<h1>Hello</h1> 
<input type='button' onClick='sethash()' value='Set Hash'> 
</body> 
</html>` 

Bei den meisten Browsern lädt die frame.html den geladenen Alarm sobald die Seite geladen ist. Wenn dann der gesetzte Hash-Knopf gedrückt wird, wird die URL geändert, aber der Hash-Wert des geladenen Alarms wird nicht mehr angezeigt. Auf Chrom und einige Versionen von IE

Microsoft Bericht möglicherweise das gleiche Problem mit Internet Explorer 5.5 link text

ich nicht dem Microsoft vorgeschlagene Lösung verwenden, das das Ereignis zu erfassen und nicht schießen, aber nur blättern in Sicht, wie ich benutze, legen Sie die top.location.hash als Teil des onLoad-Ereignisses fest.

Antwort

6

Webkit (und durch Erweiterung, Chrome) verhalten sich seltsam mit location.hash. Es gibt ein paar offene Bugs darüber, die relevanteste ist wahrscheinlich diese: https://bugs.webkit.org/show_bug.cgi?id=24578, die Ihr Problem dokumentiert, dass die Seite aktualisiert wird, wenn location.hash geändert wird. Es sieht so aus, als ob deine beste Option gerade jetzt ist, dir die Daumen zu drücken und zu hoffen, dass es sofort repariert wird.

ich aber den Fehler in IE7 nicht wiedergeben kann, und du bist die erste Person in Alter ich gesehen habe, dass IE 5.5 unterstützt, so kann ich Ihnen nicht wirklich da helfen;)

0

Haben Sie versucht, versteckte Links zu den Hashes zu erstellen und den Klick sogar auf sie zu feuern?

0

Was passiert mit location.href = '#yourhash'; Vielleicht umgeht es den Fehler.

2

Ich hatte dieses Problem auch. Meine Situation erlaubte mir, ein Window-Unbind-Event zu erstellen, das den Hash mit dem Wert, den ich auch wollte, als User-Browser auf die nächste Seite setzen oder aktualisieren ließ. Das hat für mich funktioniert, aber ich bin mir nicht sicher, ob es für dich funktioniert.

Mit jquery, ich habe:

 
if($.browser.webkit){ 
    $(window).unload(function() { 
     top.window.location.hash = hash_value; 
    }); 
}else{ 
    top.window.location.hash = hash_value; 
} 

Technisch Sie brauchen nicht den Webkit-Check zu tun, aber ich dachte, für Leute, die Firefox verwenden, könnte es schön sein, den korrekten Hash-Wert zu sehen, bevor sie Aktualisieren Sie das Frameset.

-Jacob

2

für Chrome und Safari, müssen Sie window.location.href verwenden, um den Hash zu bekommen arbeiten, anstatt window.location.hash

siehe Code unten

function loadHash(varHash) 
{ 
    if(varHash != undefined) { 
    var strBrowser = navigator.userAgent.toLowerCase(); 

    if (strBrowser.indexOf('chrome') > 0 || strBrowser.indexOf('safari') > 0) { 
     this.location.href = "#" + varHash; 
    } 
    else { 
     this.window.location.hash = "#" + varHash; 
    } 
    } 
} 
1

Ich habe eine Problemumgehung und es beinhaltet eine ganzseitige Tabelle mit eingebetteten iframes. Ich habe mein Frameset durch eine Tabelle ersetzt, die 100% Höhe und 100% Breite einnimmt und zwei Zeilen hat. Dann setze ich in jeder der Tabellenzellen einen Iframe, der für jede Zelle 100% Höhe und Breite einnimmt. Dies ahmt im Wesentlichen ein Frameset nach, ohne ein Frameset zu sein. Das Beste von allem, kein Neuladen auf Hash-Änderung!

Hier ist mein alter Code:

<html> 
<head> 
<title>Title</title> 
</head> 
<frameset rows="48,*" frameborder="yes" border="1"> 
    <frame name="header" noresize="noresize" scrolling="no" src="http://header" target="_top"> 
    <frame name="main" src="http://body" target="_top"> 
    <noframes> 
    <body> 
    <p>This page uses frames, but your browser doesn&#39;t support them.</p> 
    </body> 
    </noframes> 
</frameset> 
</html> 

... und hier ist mein neuer Code:

<html> 
<head> 
<title>Title</title> 
<style type="text/css"> 
body { margin: 0px; padding: 0px; border: none; height: 100%; } 
table { height:100%; width:100% } 
td { padding: 0px; margin: 0px; border: none; } 
td.header { height: 48px; background-color: black; } 
td.body { background-color: silver; } 
iframe.header { border: none; width: 100%; height: 100%; } 
iframe.body { border: none; width: 100%; height: 100%; } 
</style> 
</head> 
<body> 
<table cellpadding="0" cellspacing="0"> 
    <tr><td class="header"><iframe class="header" src="http://header" target="_top" scrolling="no"></iframe></td></tr> 
    <tr><td class="body"><iframe class="body" src="http://body" scrolling="no"></iframe></td></tr> 
</table> 
</body> 
</html> 

Hoffnung, das hilft.

3

Sie könnten auch HTML5 history.pushState() verwenden, um den Hash zu ändern, ohne die Seite in Chrome neu zu laden. Etwas wie folgt aus:

// frameset hash change function 
function changeHash(win, hash) { 
    if(history.pushState) { 
     win.history.replaceState(null, win.document.title, '#'+hash); 
    } else { 
     win.location.hash = hash; 
    } 
} 

Im ersten Argument müssen Sie Frameset Top-Fenster zu übergeben.

+0

Das funktioniert. Kleiner Hinweis: [Chrome zeigt ein Flackern im Favicon und Stop/Refresh-Taste] (http://code.google.com/p/chromium/issues/detail?id=50298), die etwas hässlich aussieht. – Blaise