Ändern der Position.hash ohne die Seite zu scrollen
Wir haben ein paar Seiten, die per ajax zu laden in Inhalt und es gibt ein paar Gelegenheiten, wo wir brauchen, um als deep-link in eine Seite. Anstatt einen link auf "Users" und den Leuten zu erzählen, klicken Sie auf "Einstellungen" es ist hilfreich, um in der Lage sein, um Menschen miteinander zu Benutzer.aspx#Einstellungen
Leuten zu erlauben, uns mit den richtigen links zu den einzelnen Abschnitten (für technischen support, etc.) Ich habe es eingerichtet, um automatisch ändern Sie den hash in der URL, wenn auf eine Schaltfläche geklickt wird. Das einzige Problem ist natürlich, dass, wenn dies geschieht, ist es auch scrollt die Seite bis zu diesem element.
Gibt es eine Möglichkeit, um dies zu deaktivieren? Unten ist, wie mache ich das bisher.
$(function(){
//This emulates a click on the correct button on page load
if(document.location.hash){
$("#buttons li a").removeClass('selected');
s=$(document.location.hash).addClass('selected').attr("href").replace("javascript:","");
eval(s);
}
//Click a button to change the hash
$("#buttons li a").click(function(){
$("#buttons li a").removeClass('selected');
$(this).addClass('selected');
document.location.hash=$(this).attr("id")
//return false;
});
});
Hatte ich gehofft, dass das return false;
würde aufhören, die Seite zu scrollen, aber es macht einfach den link nicht an allen arbeiten. Also, das ist nur auskommentiert jetzt, so kann ich navigieren.
Irgendwelche Ideen?
InformationsquelleAutor Chris Barr | 2009-09-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schritt 1: Sie müssen zu entschärfen, indem die Knoten-ID, bis der hash festgelegt wurde. Dies wird erreicht, indem die ID aus dem Knoten, während die hash gesetzt wird, und dann wieder hinzufügen.
Schritt 2: bei Einigen Browsern wird der Auslöser der scroll-basierend auf dem die ID hatte Knoten wurde zuletzt gesehen, so dass Sie benötigen, um Ihnen zu helfen ein wenig. Sie benötigen zum hinzufügen einer zusätzlichen
div
an die Spitze des Viewports, legen Sie dessen ID auf den hash, und dann rollt alles zurück:Schritt 3: Wickeln Sie es in ein plugin und verwenden, die anstelle des Schreibens zu
location.hash
...Diese Lösung ja gut funktioniert - aber die line: top: $.Blättern Sie().top + 'px' sein Sollte: top: $(window).scrollTop() + 'px'
Es wäre hilfreich zu wissen, welchen Browser Sie müssen Schritt 2 hier.
+1 Ausgezeichnete Arbeit Borgar.
Dank Borgar. Es wundert mich aber, dass Sie durch hinzufügen der fx-div vor dem löschen der Ziel-node-id. Das bedeutet, es gibt einen Augenblick, in dem es doppelte ID ' s in das Dokument. Scheint wie eine potenzielle Problem, oder zumindest schlechte Manieren 😉
InformationsquelleAutor Borgar
Ich glaube, ich fand eine Recht einfache Lösung. Das problem ist, dass der hash in der URL ist auch ein element auf der Seite, die Sie bekommen gescrollt. wenn ich Schreibe einfach einen text, den hash, jetzt ist es nicht mehr mit einem Verweis auf ein bestehendes element!
Nun die URL wird angezeigt, wie
page.aspx#btn_elementID
die ist nicht eine echte ID auf der Seite. Ich entfernen Sie einfach das "btn_" und nutzen Sie die aktuelle element-IDBeachten Sie, dass wenn Sie bereits begangen zu Seite.aspx#elementID URLs aus irgendeinem Grund können Sie rückgängig machen, diese Technik, und Stelle "btn_", um alle Ihre IDs
Funktioniert nicht, wenn Sie unter Verwendung von :target pseudo-Selektoren in CSS.
Liebe diese Lösung! Wir sind mit der hash-URL für die AJAX-basierte navigation, voranstellen, die IDs mit einem
/
scheint logisch.InformationsquelleAutor Chris Barr
Verwenden
history.replaceState
oderhistory.pushState
* ändern Sie hash. Dies wird nicht auslösen, die springen, um das zugehörige element.Beispiel
Demo auf JSFiddle
* Wenn Sie möchten, dass die Geschichte vorwärts und rückwärts Unterstützung
Geschichte Verhalten
Wenn Sie
history.pushState
wollen Sie nicht Seite scrollen, wenn der Nutzer die history-buttons des Browsers (vorwärts/rückwärts) schauen Sie sich die experimentellenscrollRestoration
Einstellung (Chrom 46+ nur).Browser-Unterstützung
replaceState
ist wahrscheinlich der bessere Weg, hier zu gehen. Der UnterschiedpushState
fügt ein Element in Ihre Geschichte, währendreplaceState
nicht.Danke @AakilFernandes sind Sie richtig. Ich habe soeben die Antwort.
Es ist nicht immer die
body
, Schriftrollen, manchmal ist esdocumentElement
. Finden Sie diese gist von Diego Perinijede Idee, ie8/9 hier?
check out: stackoverflow.com/revisions/...
InformationsquelleAutor HaNdTriX
Einen Ausschnitt aus Ihrem ursprünglichen code:
Ändern:
hash
- Eigenschaft bewirkt, dass die Seite zu scrollen sowieso.InformationsquelleAutor Daniel
Ich war vor kurzem Gebäude, ein Karussell, die sich auf
window.location.hash
Zustand zu halten und machte die Entdeckung, dass Chrome und webkit-Browsern wird Kraft scrollen (auch zu einem nicht sichtbaren Ziel) mit einem unbeholfenen Ruck, wenn diewindow.onhashchange
- Ereignis ausgelöst wird.Sogar versucht, einen handler registrieren, der die Haltestellen in der Propagierung:
Nichts zu stoppen Sie die Standard-browser-Verhalten.
Die Lösung, die ich fand, war mit
Fenster.Geschichte.pushState
ändern Sie hash-ohne dass unerwünschte Nebenwirkungen.Können Sie dann hören, sowohl für den normalen hashchange event und
my.hashchange
:my.hashchange
ist nur ein Beispiel-Ereignis-NamenInformationsquelleAutor max
Okay, das ist ein ziemlich altes Thema, aber ich dachte, ich würde chip als die "richtige" Antwort nicht gut funktioniert mit CSS.
Diese Lösung im Grunde verhindert das click-Ereignis von verschieben der Seite, sodass wir die scroll-position zuerst. Dann werden wir manuell hinzufügen, der hash und der browser löst automatisch eine hashchange Veranstaltung. Wir erfassen die hashchange event und Blättern wieder in die richtige position. Eine callback-trennt und verhindert, dass dein code verursacht eine Verzögerung, indem Sie Ihre hash-hacking in einem Ort.
InformationsquelleAutor Egor Kloos
Erm ich habe ein etwas grob, aber definitiv arbeiten-Methode.
Nur speichern der aktuellen scroll-position in die variable "temp" und dann setzen Sie es nach der änderung des hash. 🙂
So für das original-Beispiel:
InformationsquelleAutor Jan Paepke
Ich glaube nicht, dass dies möglich ist. Soweit ich weiß, nur die Zeit, die ein browser nicht scrollen, um eine veränderte
document.location.hash
ist, wenn der hash nicht existiert innerhalb der Seite.Dieser Artikel nicht direkt mit deiner Frage, aber es beschreibt typische browser-Verhalten zu ändern
document.location.hash
InformationsquelleAutor Ben S
wenn Sie hashchange event mit hash-parser können Sie verhindern, dass Standard-Aktion auf links und Speicherort ändern.hash hinzufügen von einem Charakter zu haben, der Unterschied mit der id-Eigenschaft eines Elements
InformationsquelleAutor polkila
Hinzufügen dieses hier, weil der weitere relevante Fragen wurden als Duplikate gekennzeichnet zeigen hier...
Meine situation ist einfacher:
a[href='#something']
)e.preventDefault()
$("html,body").stop(true,true).animate({ "scrollTop": linkoffset.top }, scrollspeed, "swing" );
window.location = link;
Diese Weise den Blättern Auftritt, und es gibt kein springen, wenn der Standort aktualisiert wird.
InformationsquelleAutor ptim
Den anderen Weg, dies zu tun ist, fügen Sie ein div, die versteckt an der Spitze des Arbeitsbereichs. Dieses div ist dann jeweils die id des hash, bevor der hash der url Hinzugefügt wird....so dann Sie nicht bekommen, eine schriftrolle.
InformationsquelleAutor Mike Rifgin
Hier ist meine Lösung für die Geschichte-aktivierte Registerkarten:
Werden und die zuletzt ausgewählte Registerkarte:
Hinweis: die
*=
auf diefilter
nennen. Dies ist ein jQuery-spezifische Sache, und ohne dass es Ihre Geschichte-aktivierten tabs, wird scheitern.InformationsquelleAutor user1429980
Diese Lösung schafft ein div mit der tatsächlichen scrollTop und entfernt es nach dem Wechsel hash:
optional, Auslösung Anker Ereignis bei laden der Seite:
InformationsquelleAutor
Habe ich eine einfachere Methode, die funktioniert für mich. Im Grunde, denken Sie daran, was der hash ist eigentlich in HTML. Es ist ein Anker-link, um einen Name-tag. Das ist, warum es scrollt...der browser versucht zu scrollen, um einen Anker-link. So, geben Sie es ein!
Namen Ihrer Sektion divs mit Klassen anstelle von IDs.
In Ihre Verarbeitung-code, entfernen Sie das hash-Symbol und ersetzen mit einem Punkt:
Schließlich, Sie auf element entfernen.preventDefault oder return: false und ermöglichen den nav zu passieren. Das Fenster bleibt an der Spitze, der hash angehängt werden, um die Adressleiste die url und das richtige Fenster öffnet.
InformationsquelleAutor ColdSharper
Ich glaube, Sie brauchen, um zurückzusetzen, scrollen Sie, um seine position vor dem hashchange.
InformationsquelleAutor iProDev
Wenn auf Ihrer Seite, die Sie verwenden, id wie eine Art Ankerpunkt, und Sie haben Szenarien, wo Sie wollen, um Benutzern das Anhängen von #etwas an das Ende der url und die Seite scrollen, um das #etwas Abschnitt, indem Sie mit Ihrem eigenen definierten animierte javascript-Funktion, hashchange event-listener werden nicht in der Lage, das zu tun.
Wenn Ihr einfach einen debugger sofort nach dem hashchange-event, zum Beispiel so etwas(gut, ich jquery verwenden, aber Sie erhalten den Punkt):
Werden Sie feststellen, dass, sobald Sie Ihre url ein, und drücken Sie die enter-Taste, wird die Seite hält Sie im entsprechenden Abschnitt sofort, nur danach, Ihre eigenen definierten Scroll-Funktion wird ausgelöst, und es Art von Schriftrollen, die Sektion, die sehr schlecht aussieht.
Mein Vorschlag ist:
verwenden Sie keine id, wie Sie Ihren Ankerpunkt, um den Abschnitt Sie möchten, um zu Blättern.
Wenn Sie verwenden müssen-ID, wie ich es Tue. Verwenden Sie 'popstate' event-listener statt, es wird nicht automatisch ein Bildlauf bis zum Abschnitt, den Sie an die url angefügt wird, stattdessen, Sie können rufen Sie Ihre eigene benutzerdefinierte Funktion innerhalb des popstate-event.
$(window).on('popstate', function(){myscrollfunction()});
Schließlich müssen Sie noch ein bisschen trick in Ihrem eigenen definierten Scroll-Funktion:
löschen-id auf dem tag und es zurücksetzen.
Dies sollte den trick tun.
InformationsquelleAutor Shuwei
Nur fügen Sie diesen code in jQuery-Dokument bereit
Ref : http://css-tricks.com/snippets/jquery/smooth-scrolling/
InformationsquelleAutor Saygın Karahan