2009-10-17 3 views
0

Actuellement, j'ai une zone de texte avec un événement onkeypress spécifié dans la balise HTML. J'essaie de capturer cette touche et de l'enregistrer comme une fonction qui sera utilisée pour la remplacer, car je veux ajouter une autre condition quand elle est exécutée. Voici le code que j'essaie de mettre en œuvre.Désactiver l'événement de frappe de clé javascript original et le remplacer dynamiquement

$(document).ready(function(e) { 
    var defaultKeypress = $('textarea').keypress; 
    $('textarea').keypress(function(e) { 
     if (fieldsChanged) { 
      fieldsChanged = false; 
     } 
     else { 
      defaultKeypress(e); 
     } 

    }); 
}); 

La question que j'ai est avec IE 7 & 8. Les deux feu le keypress d'origine (même si « defaultKeypress (e) » est commenté) et la nouvelle pression de touche sont tir. (Original en premier, puis nouveau). Autre que de supprimer l'attribut onkeypress de la balise textarea (je ne peux pas le faire car si le code est généré), y a-t-il un moyen de désactiver cette touche originale de tir?

Merci! Nutzy

Répondre

4

méthode de jQuery keypressajoute le gestionnaire vous passez à et ne pas quoi que ce soit prioritaire. C'est très par conception. De cette façon, vous pouvez attacher plusieurs gestionnaires d'événements à l'élément en question et ne pas avoir à vous soucier d'écraser les gestionnaires existants.

Vous en fait voulez pour clobber le gestionnaire existant. Vous ne pouvez pas utiliser unbind pour cela. Vous pouvez simplement supprimer le gestionnaire vous quand même si:

var $el = $('textarea'), 
    defaultKeypress = $el.attr('onkeypress'); 

$el.removeAttr('onkeypress'); 

$el.keypress(function(e) { 
    if (fieldsChanged) { 
     fieldsChanged = false; 
    } 
    else { 
     return defaultKeypress.apply(this, arguments); 
    } 
}); 

Avis que j'appelle defaultKeypress la portée correcte à l'aide apply, ainsi que l'utilisation return pour passer son résultat en arrière. C'est tout pour maintenir l'environnement de gestionnaire d'événements standard que le navigateur aurait appelé avec.

Références:

+0

Avec quelques légères modifications, cela a fonctionné parfaitement! Merci! – Nutzy

1

Avez-vous examiné la méthode unbind?

Je n'ai pas essayé cela mais j'imagine que ça devrait fonctionner comme ça.

$(document).ready(function(e) { 
    var defaultKeypress = $('textarea').keypress; 
    $('textarea').unbind("keypress"); 
    $('textarea').keypress(function(e) { 
     if (fieldsChanged) { 
      fieldsChanged = false; 
     } 
     else { 
      defaultKeypress(e); 
     } 

    }); 
}); 
+1

Malheureusement, cela ne fonctionne pas. Je pense que le unbind est seulement pour les fonctions qui sont liées à partir du code javascript. J'apprécie votre réponse rapide si! Ce problème me tourmente depuis un certain temps maintenant ... – Nutzy

Questions connexes