2009-06-30 10 views
16

jQuery hyperlinks - href value? text] [1]jquery cliquez sur l'élément d'ancrage pour faire défiler vers le haut?

Je rencontre un problème lors de l'utilisation de jquery et d'un événement click attaché à un élément d'ancrage. [1]: jQuery hyperlinks - href value? "Cette" question SO semble être un doublon, et la réponse acceptée ne semble pas résoudre le problème. Désolé si cela est mauvais SO étiquette.

Dans ma fonction .ready() J'ai:

jQuery("#id_of_anchor").click(function(event) { //start function when any update link is clicked 
     Function_that_does_ajax(); 
     }); 

et mon ancre ressemble à ceci:

<a href="#" id="id_of_anchor"> link text </a> 

mais lorsque le lien est cliqué, la fonction ajax est effectuée comme souhaité, mais le navigateur défile en haut de la page. pas bon.

J'ai essayé d'ajouter:

event.preventDefault(); 

avant d'appeler ma fonction qui ne l'ajax, mais cela ne suffit pas. Qu'est-ce qui me manque?

Précision

Je l'ai utilisé toutes les combinaisons de

return false; 
event.preventDefault(); 
event.stopPropagation(); 

avant et après mon appel à mes js fonction ajax. Il défile toujours vers le haut.

+0

Est-il possible de voir la page actuelle? Je peux vous donner un exemple en deux minutes, mais je ne suis pas sûr que cela vous aidera beaucoup - avez-vous essayé? Suppression des facteurs environnants jusqu'à ce que cela fonctionne? –

Répondre

17

Cela devrait fonctionner, pouvez-vous préciser ce que vous entendez par «avant»? Est-ce que tu fais ça?

jQuery("#id_of_anchor").click(function(event) { 
    event.preventDefault(); 
    Function_that_does_ajax(); 
}); 

Parce que devrait travailler dans le sens que si cela ne fonctionne pas que vous faites quelque chose de mal et nous aurions besoin de voir plus de code. Cependant, par souci d'exhaustivité, vous pouvez aussi essayer ceci:

jQuery("#id_of_anchor").click(function() { 
    Function_that_does_ajax(); 
    return false; 
}); 

EDIT

Here is an example of this working.

Les deux liens utilisent ce code:

$('#test').click(function(event) { 
    event.preventDefault(); 
    $(this).html('and I didnt scroll to the top!'); 
}); 

$('#test2').click(function(event) { 
    $(this).html('and I didnt scroll to the top!'); 
    return false; 
}); 

Et comme vous pouvez le voir, ils travaillent très bien.

+0

J'ai ajouté plus de détails à ma question, et ne doutez absolument pas que je fais quelque chose de mal, quel code aimeriez-vous voir? –

+0

Aha! Si vous utilisez return false, vous ne pouvez pas avoir le paramètre event. Donc, je l'ai fonctionné, mais j'aimerais toujours savoir pourquoi event.preventDefault() ne fonctionne pas. –

+0

le paramètre d'événement ne devrait pas être un problème, regardez la page d'exemple que je viens de mettre en place. Cela fonctionne pour moi bien sur ff, ie6, ie7 –

2
$("#id_of_anchor").click(function(event) { 
    // ... 
    return false; 
} 
3

Cette question est plus d'un exercice de débogage car il est indiqué que vous utilisez les bonnes fonctions du jQuery Event object.

Dans un gestionnaire d'événements jQuery, vous pouvez effectuer, ou les deux, de deux choses fondamentales:

1. Prévenir le comportement par défaut de l'élément (A HREF = « n », dans votre cas) :

jQuery("#id_of_anchor").click(function(evt) { 
    // ... 
    evt.preventDefault(); // assuming your handler has "evt" as the first parameter 
    return false; 
} 

2. Arrêtez l'événement de se propager aux gestionnaires d'événements sur les éléments HTML environnants:

jQuery("#id_of_anchor").click(function(evt) { 
    // ... 
    evt.stopPropagation(); // assuming your handler has "evt" as the first parameter 
} 

Puisque vous n'êtes pas obtenir le comportement attendu, vous devez prendre l'appel ajax temporairement, le remplacer par un code anodin comme la création d'un valeur de formulaire, ou -shudder- alert ("OK") et testez si vous continuez à faire défiler vers le haut.

5

vous pouvez utiliser javascript: void (0); dans la propriété href.

0

J'ai eu le même problème.

Je pense que cela se produit lorsque vous liez l'événement avant d'ajouter l'élément au DOM.

5

Comme Tilal dit plus haut:

<a id="id_of_anchor" href="javascript:void(0)" /> 

maintient la balise d'ancrage regardant à droite, vous permet d'assigner des gestionnaires de cliquer pour avec javascript, et ne défile pas. Nous l'utilisons intensivement juste pour cette raison.

0

Cela m'a beaucoup aidé avec le code ci-dessous. Je vous remercie!

 $(document).ready(function() { 
     $(".dropdown dt a").click(function(event) { 
     event.preventDefault(); 
      $(".dropdown dd ul").toggle('slow'); 
     });   
     $(".dropdown dd ul li a").click(function(event) { 
     event.preventDefault(); 
      $(".dropdown dd ul").hide(); 
     }); 
    }); 
1

perdre juste le

href="#" 

Dans la balise html ... qui est ce qui provoque la page Web pour "sauter".

<a id="id_of_anchor"> link text </a> 

et souvenez-vous d'ajouter

cursor: pointer; 

à votre un css de sorte qu'il ressemble à un lien sur mouseover.

Bonne chance.

+0

Pas vraiment recommandé moyen de supprimer l'attribut href, mais après avoir vérifié avec le validateur HTML, il a passé le test de façon surprenante Donc, j'ai upvote celui-ci aussi – Melvin