2010-11-26 2 views
4

Existe-t-il un moyen d'exécuter une fonction uniquement si event.preventDefault() est appelée sur un événement (par une autre fonction inconnue). Ceci est pour un plugin jQuery, donc je n'ai aucune connaissance de ce que les autres parties de la page pourraient faire. J'ai essayé ceci:exécuter la fonction uniquement si l'événement par défaut est/n'est pas empêché

Event.test = Event.preventDefault; 
Event.preventDefault = function() { 
    alert('Success'); 
    this.test(); 
} 

mais cela ne fonctionne pas ... se comporte comme normal, sans erreurs. Inversement, je veux aussi le contraire ... appeler une fonction seulement si event.preventDefault() n'est pas appelé. En effet, pour ajouter une fonction à l'action par défaut pour un événement. Des idées? Tout cela est-il possible? Editer: Basé sur le commentaire, j'ai une solution au premier problème: http://jsfiddle.net/nathan/VAePB/9/. Il fonctionne dans Chrome (alertes function preventDefault() { [native code] }, mais les alertes IE undefined) Donc IE ne me laissera pas définir Event.prototype.test, mais il me permettra de redéfinir Event.prototype.preventDefault.Wird je suis sûr que je peux venir avec . une solution au second problème en fonction de celui-ci si je peux l'obtenir pour travailler dans IE

+2

Vous pouvez voir ce que vous pouvez obtenir par déconner avec « preventDefault » sur 'Event.prototype' au lieu de' Event' - ne fonctionnera probablement pas dans IE mais – Pointy

+0

@Pointy Merci. Fonctionne dans Chrome. Il fonctionne à moitié dans IE8 ... IE exécute ma nouvelle fonction, mais n'empêche pas le défaut, ce qui est un peu gênant. Il doit y avoir un moyen de contourner cela, sûrement. –

+0

Wow, IE a un comportement merdique face à ce problème ... J'ai même recréé la méthode preventDefault comme une nouvelle fonction appelée test qui retourne juste false. Pas de dé. – Stephen

Répondre

0

pour le premier problème, essayez quelque chose comme ceci:

oldPreventDefault = Event.prototype.preventDefault; 
Event.prototype.preventDefault = function() { 
    //do stuff 
    oldPreventDefault.call(this); 
} 

Je ne sais pas si cela fonctionnera, mais cela pourrait valoir la peine

Pour le second problème, je voudrais essayer quelque chose de similaire à la gestion d'événements en direct. élément nt (c.-à-d. body ou un niveau supérieur div). Si vous pouvez obtenir votre crochet dans preventDefault comme indiqué précédemment, vous pouvez l'utiliser pour définir un indicateur. Si l'événement fait une bulle jusqu'à cet élément et que votre drapeau n'est pas défini, faites votre comportement étendu. Bien que cela ne fonctionnera pas avec tous les événements, car tous les événements ne se produisent pas. Une autre façon de résoudre ce problème pourrait être de retarder l'exécution jusqu'à ce que la pile en cours ait fini d'utiliser setTimeout(0,...), puis de vérifier l'indicateur.

3

Je ne suis pas sûr d'avoir compris. Tu ne peux pas utiliser juste event.isDefaultPrevented() comme this

Questions connexes