Je pense que ce n'est peut-être pas possible, je vais essayer d'expliquer du mieux que je peux. J'ai une page contenant des onglets (jquery powered), contrôlés par ce qui suit:
J'utilise ce code, tel que fourni par un autre utilisateur à partir d'une question précédente.
<script type="text/javascript">
$(function() {
$('html, body').animate({scrollTop:0}); // this is my "fix"
var tabContent = $(".tab_content");
var tabs = $("#menu li");
var hash = window.location.hash;
tabContent.not(hash).hide();
if(hash=="") {
$('#tab1').fadeIn();
}
tabs.find('[href=' + hash + ']').parent().addClass('active');
tabs.click(function() {
$(this).addClass('active').siblings().removeClass('active');
tabContent.hide();
var activeTab = $(this).find("a").attr("href");
$(activeTab).fadeIn();
return false;
});
});
</script>
ce code fonctionne très bien lorsque je visite directement la page "onglets".
cependant, j'ai besoin de créer un lien vers des onglets individuels à partir d'autres pages - pour ce faire, le code obtient window.location.hash
alors l'onglet approprié.
la page ne "saute" pas à l'ancre à cause de "return false".
cet événement n'est cependant déclenché que sur un événement de clic. par conséquent, si je visite mes "onglets" depuis n'importe quelle autre page, l'effet "saut" est déclenché. Pour lutter contre cela, je fais défiler automatiquement vers le haut de la page, mais je préférerais que cela ne se produise pas.
y a-t-il un moyen de simuler "return false" lorsque la page se charge, empêchant le "saut" d'ancre de se produire.
J'espère que c'est assez clair.
Merci
setTimeout
et cela n'a pas toujours fonctionné. Vous n'en avez probablement pas besoin si c'est dans jQuery de$(function() {
toute façon. Vous n'en avez pas vraiment besoinlocation.hash
, mais c'est bien de le laisser pour que les navigateurs n'aient rien à faire. Vous rappelle également à quoi sert le scrollTo!if
devrait être à l'extérieur, pas à l'intérieur. aussi, le minimum pour l'intervalle est d'environ 10, donc 0 ou 1 est le même..as 10. selon le navigateur.Voir ma réponse ici: Réponse de Stackoverflow
L'astuce consiste simplement à supprimer le hashtag dès que possible et à stocker sa valeur pour votre propre usage:
Il est important de ne pas mettre cette partie du code dans les fonctions $ () ou $ (window) .load () car il serait trop tard et le navigateur s'est déjà déplacé vers la balise.
la source
Il existe d'autres moyens de suivre l'onglet sur lequel vous vous trouvez; peut-être définir un cookie, ou une valeur dans un champ caché, etc.
Je dirais que si vous ne voulez pas que la page saute au chargement, vous feriez mieux d'utiliser l'une de ces autres options plutôt que le hachage, car la principale raison d'utiliser le hachage de préférence à eux est d'autoriser exactement ce que vous veulent bloquer.
Un autre point - la page ne sautera pas si vos liens de hachage ne correspondent pas aux noms des balises dans le document, donc peut-être que si vous souhaitez continuer à utiliser le hachage, vous pouvez manipuler le contenu afin que les balises soient nommées différemment. Si vous utilisez un préfixe cohérent, vous pourrez toujours utiliser Javascript pour passer de l'un à l'autre.
J'espère que cela pourra aider.
la source
J'ai utilisé la solution de dave1010, mais c'était un peu nerveux quand je l'ai mise dans la fonction $ (). Ready. Alors j'ai fait ceci: (pas à l'intérieur du $ (). Ready)
la source
Le navigateur saute à
<element id="abc" />
s'il y a du hachage http://site.com/#abc dans l'adresse et que l'élément avec id = "abc" est visible. Alors, il vous suffit devez masquer l'élément par défaut:<element id="anchor" style="display: none" />
. S'il n'y a pas d'élément visible avec id = hash sur la page, le navigateur ne sautera pas.Créez un script qui vérifie le hachage dans l'URL, puis trouve et affiche l'élément approprié (qui est masqué par défaut).
Désactivez le comportement par défaut "lien de type hachage" en liant un événement onclick à un lien et spécifiez-le
return false;
comme résultat de l'événement onclick.Quand j'ai implémenté des onglets, j'ai écrit quelque chose comme ça:
la source
Aucune des réponses ne fonctionne pas assez bien pour moi, je vois la page sauter à l'ancre puis au sommet pour certaines solutions, certaines réponses ne fonctionnent pas du tout, les choses peuvent être modifiées pendant des années. J'espère que ma fonction aidera quelqu'un.
la source
$(document).ready(function () { preventAnchorScroll(); });
simplement la fonction au tout début de votre JavaScript. Je l'ai testé maintenant, fonctionne pour moi dans Chrome, Firefox et Opera.Le CSS sale corrige uniquement pour rester en défilement à chaque fois que l'ancre est utilisée (pas utile si vous voulez toujours utiliser des ancres pour les sauts de défilement, très utile pour les liens profonds):
la source
Bien que la réponse acceptée fonctionne bien, j'ai trouvé que parfois, en particulier sur les pages contenant de grandes images, la barre de défilement saute énormément en utilisant
Ce qui peut être assez gênant pour l'utilisateur.
La solution sur laquelle j'ai opté à la fin est en fait assez simple, et consiste à utiliser un identifiant différent sur la cible de celui utilisé dans
location.hash
Par exemple:
Voici le lien sur une autre page
Donc, bien sûr, s'il y a un élément avec un ID de
tab2
sur la page des onglets, la fenêtre y sautera au chargement.Vous pouvez donc ajouter quelque chose à l'ID pour l'empêcher:
Et puis vous pouvez ajouter
"-noScroll"
àlocation.hash
la javascript:la source
Dans mon cas, en raison de l'utilisation du lien d'ancrage pour le popup CSS, j'ai utilisé cette façon:
Enregistrez simplement la première chose pageYOffset en cliquant, puis définissez ScrollTop sur cela:
la source
Je pense que j'ai trouvé un moyen pour les onglets d'interface utilisateur sans refaire la fonctionnalité. Jusqu'à présent, je n'ai trouvé aucun problème.
Le tout dans un événement prêt. Il ajoute «tab_» pour le hachage mais fonctionne à la fois lorsque vous cliquez dessus et que la page est chargée avec le hachage.
la source
Cela fonctionnera avec bootstrap v3
la source
Une autre approche
Essayez de vérifier si la page a été défilée, puis réinitialisez la position:
Heres a demo
la source
Je n'ai pas eu beaucoup de succès avec les
setTimeout
méthodes ci-dessus dans Firefox.Au lieu d'un setTimeout, j'ai utilisé une fonction onload:
C'est encore très glitch, malheureusement.
la source
Je n'ai pas eu de succès constant avec ces solutions.
Apparemment en raison du fait que le saut se produit avant Javascript => référence ( http://forum.jquery.com/topic/preventing-anchor-jump )
Ma solution est de positionner toutes les ancres en haut par défaut avec CSS.
Ensuite, utilisez jquery pour faire défiler jusqu'au parent de l'ancre cible, ou un frère (peut-être une balise em vide)
jquery exemple pour faire défiler lorsque l'URL est saisie avec hachage
(la page ne doit pas être déjà chargée dans la fenêtre / l'onglet, cela couvre les liens provenant d'autres sources / sources externes)
Vous voudrez également empêcher la valeur par défaut des clics d'ancrage sur la page, puis faire défiler jusqu'à leurs cibles
et jquery
La bonne chose à propos de cette méthode est que les cibles de balises d'ancrage restent structurellement à côté du contenu pertinent, bien que leur position CSS soit en haut.
Cela devrait signifier que les robots des moteurs de recherche n'auront pas de problème.
Cheers, j'espère que cela aide
Gray
la source
Essayez ceci pour empêcher le client de tout type de défilement vertical sur le hachage (dans votre gestionnaire d'événements):
(rafraîchissement du navigateur)
la source
Résolu mon promlem en faisant ceci:
la source