web-dev-qa-db-fra.com

e.preventdefault (); ne fonctionne pas

J'ai vraiment du mal à faire fonctionner e.preventDefault();.

Voici mon code

$('#ListSnapshot a').live('click', function(e){
    var url = $(this).attr('href') +' #WebPartWPQ2 .ms-listviewtable';
    $('#ListSnapshot').load(url);
    e.preventDefault();
});

Quelqu'un pourrait-il expliquer ce que je fais de mal, je peux voir que la fonction de chargement fonctionne, mais la page redirige ensuite vers le lien sur lequel je dois cliquer pour éviter.

J'ai également essayé de déplacer e.preventDefault(); en haut de la fonction, en vain.

25
Gary

J'ai eu un problème similaire, dans lequel e.preventDefault() fonctionnerait sur certains cas, mais pas sur d'autres. Aucune erreur n'a été détectée, et l'utilisation de try-catch ne permettait pas d'afficher le catch alert. Ajouter e.stopImmediatePropagation() a été efficace, au cas où cela aiderait quelqu'un (merci à wcpro)

26
jcsierra.27

je pense que vous pouvez avoir le scenerio suivant ... au moins, cela reproduira l'erreur

vous pouvez avoir un événement plus haut configuré pour l'événement survol, cet événement peut utiliser une liaison, et même si vous appelez e.preventdefault, il appelle toujours la liaison en premier; au lieu de lier. alors cela devrait fonctionner comme prévu. Vérifiez cet échantillon.

http://jsfiddle.net/rodmjay/mnkq3/

$('div').bind ('click', function(){ // <-- switch this to live and you will see different behavior

    alert('div click');

});

$('a').live('click', function(e){


    alert('a click');

    e.stopImmediatePropagation();


});
8
Rod Johnson

Le code que vous avez fourni doit absolument fonctionner ( exemple de travail ). Il doit y avoir un autre problème avec votre code.

Essayez de placer une alerte dans votre gestionnaire d'événements pour vous assurer qu'il déclenche du tout. Il est possible que votre #ListSnapshot a ne trouve rien.

Si quelque chose ne va pas dans votre gestionnaire, cela provoque une exception qui pourrait empêcher le javascript de s'exécuter complètement jusqu'à l'appel preventDefault. Je ne vois pas ce que cela pourrait être dans le code que vous avez fourni, cependant.

6
David Hedlund

Je pense que la réponse de @David Hedlund est correcte, il doit y avoir une exception. Lorsque j'écris des gestionnaires d'événements, j'utilise un bloc try...catch pour m'assurer que l'action par défaut ne se produit pas. Essaye ça:

$('#ListSnapshot a').live('click', function(e){
    try {
        var url = $(this).attr('href') +' #WebPartWPQ2 .ms-listviewtable';
        $('#ListSnapshot').load(url);
    } catch(ex) {
        alert('An error occurred and I need to write some code to handle this!');
    }
    e.preventDefault();
});

Ainsi, puisque e.preventDefault(); est en dehors du bloc try, même si une erreur se produit, e.preventDefault(); sera toujours appelé.

3
Josh

Avez-vous déjà essayé d’emballer le gestionnaire d’événements dans $ (document) .ready (...)? Juste une pensée.

3
pckozub

e.preventDefault () doit être exécuté avant les autres lignes de code du gestionnaire.

$('#ListSnapshot a').live('click', function(e){
    e.preventDefault();
    var url = $(this).attr('href') +' #WebPartWPQ2 .ms-listviewtable';
    $('#ListSnapshot').load(url);
});
2
designerdre101

Essayez de retourner false. live ne fonctionnera pas toujours de la même manière que bind fonctionne. vérifiez jquery docs .

2
Teja Kantamneni

Vieille question, mais c’est le genre de moment où voir ce que firebug enregistre dans la console ou renvoie comme erreur. Quelque chose dans votre code empêche évidemment preventDefault () d'empêcher une redirection.

0