Nous avons quelques pages utilisant ajax pour charger du contenu et il y a quelques occasions où nous devons créer un lien profond dans une page. Au lieu d'avoir un lien vers "Utilisateurs" et de dire aux gens de cliquer sur "Paramètres", il est utile de pouvoir associer des personnes à user.aspx # settings
Pour permettre aux gens de nous fournir des liens corrects vers des sections (pour le support technique, etc.), je l'ai configuré pour modifier automatiquement le hachage dans l'URL chaque fois qu'un bouton est cliqué. Le seul problème est bien sûr que lorsque cela se produit, cela fait également défiler la page jusqu'à cet élément.
Existe-t-il un moyen de désactiver cela? Voici comment je fais cela jusqu'à présent.
$(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;
});
});
J'avais espéré que return false;
cela empêcherait la page de défiler - mais cela empêche simplement le lien de fonctionner du tout. Donc c'est juste commenté pour l'instant afin que je puisse naviguer.
Des idées?
Utilisez
history.replaceState
ouhistory.pushState
* pour changer le hachage. Cela ne déclenchera pas le saut vers l'élément associé.Exemple
Démo sur JSFiddle
* Si vous voulez un support historique et arrière
Comportement historique
Si vous utilisez
history.pushState
et que vous ne souhaitez pas que la page défile lorsque l'utilisateur utilise les boutons d'historique du navigateur (avant / arrière), consultez lescrollRestoration
paramètre expérimental (Chrome 46+ uniquement) .Prise en charge du navigateur
la source
replaceState
est probablement la meilleure façon de procéder ici. La différence étantpushState
ajoute un élément à votre historique alors que cereplaceState
n'est pas le cas.body
qui défile, parfois c'est ledocumentElement
. Voir l' essentiel de Diego PeriniJe pense avoir trouvé une solution assez simple. Le problème est que le hachage dans l'URL est également un élément de la page vers lequel vous faites défiler. si je préfère juste du texte au hachage, maintenant il ne fait plus référence à un élément existant!
Maintenant, l'URL apparaît comme
page.aspx#btn_elementID
n'étant pas un véritable identifiant sur la page. Je viens de supprimer "btn_" et j'obtiens l'ID d'élément réella source
/
semble logique.Un extrait de votre code d'origine:
Remplacez ceci par:
la source
hash
propriété entraînera quand même le défilement de la page.J'ai récemment construit un carrousel qui repose sur
window.location.hash
le maintien de l'état et j'ai découvert que les navigateurs Chrome et Webkit forceraient le défilement (même vers une cible non visible) avec une secousse maladroite lorsque l'window.onhashchange
événement est déclenché.Même essayer d'enregistrer un gestionnaire qui arrête la propagation:
N'a rien fait pour arrêter le comportement par défaut du navigateur. La solution que j'ai trouvée consistait
window.history.pushState
à changer le hachage sans déclencher les effets secondaires indésirables.Vous pouvez ensuite écouter à la fois l'événement de hachage normal et
my.hashchange
:la source
my.hashchange
c'est juste un exemple de nom d'événementD'accord, c'est un sujet assez ancien, mais je pensais que j'interviendrais car la réponse `` correcte '' ne fonctionne pas bien avec CSS.
Cette solution empêche essentiellement l'événement de clic de déplacer la page afin que nous puissions obtenir la position de défilement en premier. Ensuite, nous ajoutons manuellement le hachage et le navigateur déclenche automatiquement un événement hashchange . Nous capturons l'événement hashchange et retournons à la bonne position. Un rappel sépare et empêche votre code de causer un retard en gardant votre hacking au même endroit.
la source
Euh, j'ai une méthode un peu rudimentaire mais qui fonctionne vraiment.
Il suffit de stocker la position de défilement actuelle dans une variable de température, puis de la réinitialiser après avoir modifié le hachage. :)
Donc, pour l'exemple d'origine:
la source
Je ne pense pas que ce soit possible. Pour autant que je sache, la seule fois où un navigateur ne fait pas défiler jusqu'à une modification
document.location.hash
est si le hachage n'existe pas dans la page.Cet article n'est pas directement lié à votre question, mais il traite du comportement typique du navigateur en cas de modification
document.location.hash
la source
si vous utilisez l'événement hashchange avec l'analyseur de hachage, vous pouvez empêcher l'action par défaut sur les liens et changer d'emplacement.hash en ajoutant un caractère pour avoir une différence avec la propriété id d'un élément
la source
L'ajout de ceci ici car les questions les plus pertinentes ont toutes été marquées comme des doublons pointant ici…
Ma situation est plus simple:
a[href='#something']
)e.preventDefault()
$("html,body").stop(true,true).animate({ "scrollTop": linkoffset.top }, scrollspeed, "swing" );
window.location = link;
De cette façon, le défilement se produit et il n'y a pas de saut lorsque l'emplacement est mis à jour.
la source
L'autre façon de procéder consiste à ajouter un div masqué en haut de la fenêtre. Ce div reçoit ensuite l'ID du hachage avant que le hachage ne soit ajouté à l'url .... donc vous n'obtenez pas de défilement.
la source
Voici ma solution pour les onglets activés pour l'historique:
Et pour afficher le dernier onglet sélectionné:
Notez le
*=
sur l'filter
appel. C'est une chose spécifique à jQuery, et sans cela, vos onglets activés pour l'historique échoueront.la source
Cette solution crée un div au niveau du scrollTop réel et le supprime après avoir changé le hachage:
facultatif, déclenchant un événement d'ancrage au chargement de la page:
la source
J'ai une méthode plus simple qui fonctionne pour moi. En gros, rappelez-vous ce qu'est réellement le hachage en HTML. C'est un lien d'ancrage vers une étiquette de nom. C'est pourquoi il défile ... le navigateur tente de faire défiler jusqu'à un lien d'ancrage. Alors, donnez-lui un!
Nommez vos divisions de section avec des classes au lieu d'ID.
Dans votre code de traitement, supprimez la marque de hachage et remplacez-la par un point:
Enfin, supprimez element.preventDefault ou return: false et laissez la navigation se produire. La fenêtre restera en haut, le hachage sera ajouté à l'URL de la barre d'adresse et le panneau approprié s'ouvrira.
la source
Je pense que vous devez réinitialiser le défilement à sa position avant le changement de hachage.
la source
Si sur votre page vous utilisez id comme sorte de point d'ancrage, et que vous avez des scénarios dans lesquels vous voulez que les utilisateurs ajoutent # quelque chose à la fin de l'url et que la page défile jusqu'à cette # section quelque chose en utilisant votre propre animation définie javascript, l'écouteur d'événements hashchange ne pourra pas le faire.
Si vous mettez simplement un débogueur immédiatement après l'événement hashchange, par exemple, quelque chose comme ça (enfin, j'utilise jquery, mais vous voyez le point):
Vous remarquerez que dès que vous changez votre URL et appuyez sur le bouton Entrée, la page s'arrête immédiatement à la section correspondante, seulement après cela, votre propre fonction de défilement définie sera déclenchée, et elle défile en quelque sorte vers cette section, qui ressemble très mauvais.
Ma suggestion est:
n'utilisez pas id comme point d'ancrage vers la section vers laquelle vous voulez faire défiler.
Si vous devez utiliser une pièce d'identité, comme moi. Utilisez plutôt l'écouteur d'événement 'popstate', il ne défilera pas automatiquement jusqu'à la section même que vous ajoutez à l'url, à la place, vous pouvez appeler votre propre fonction définie dans l'événement popstate.
$(window).on('popstate', function(){myscrollfunction()});
Enfin, vous devez faire un petit tour dans votre propre fonction de défilement définie:
supprimez l'identifiant de votre balise et réinitialisez-le.
Cela devrait faire l'affaire.
la source
N'ajoutez ce code dans jQuery que lorsque le document est prêt
Réf: http://css-tricks.com/snippets/jquery/smooth-scrolling/
la source