Conversion d'un objet d'événement de navigateur natif en un objet d'événement jQuery

Je affecte une fonction de gestionnaire d'événements à un élément via la propriété onclick du navigateur natif:

document.getElementById('elmtid').onclick = function(event) { anotherFunction(event) }; 

Lorsque je suis dans anotherFunction(event) , je souhaite utiliser l'objet d'événement comme je le ferais avec l'objet d'événement que vous obtenez dans jQuery à l'aide de la méthode .on() . Je veux le faire car l'objet d'événement jQuery possède des propriétés et des méthodes telles que .pageX , .pageY et .stopPropagation() qui fonctionnent dans tous les navigateurs.

Donc, ma question est posée, après avoir passé dans l'objet d'événement du navigateur natif dans anotherFunction() , comment puis-je la transformer en un événement jQuery? J'ai essayé $(event) , mais cela n'a pas marché.

La question évidente ici est la suivante: pourquoi n'utilisez-vous pas jQuery .on , .bind , .click etc pour assigner vos fonctions de gestion d'événement? La réponse: Je construis une page qui contient une énorme table avec beaucoup de choses cliquables. Malheureusement, ce projet exige que la page DOIT rendre rapidement dans IE6 et IE7. L'utilisation de .on et al dans IE6 et IE7 crée des fuites DOM et consomme de la mémoire très rapidement (testez-vous avec Drip: http://outofhanwell.com/ieleak/index.php?title=Main_Page ). Le fait de configurer le comportement de .onclick via .onclick est la seule option que je dois faire rapidement dans IE6 et IE7.

Trop longtemps pour un commentaire … Parce que la documentation est un peu vague à ce sujet … (je regarde 1.7.1 dans ce qui suit)

jQuery.Event(event, props) :

  • Crée un nouvel objet
  • Définit sa propriété de type propriété type de l'événement.
  • isDefaultPrevented par les appels normalisés à toutes les façons de vérifier si la valeur par défaut est empêchée.
  • Configure originalEvent pour faire référence à l'événement que vous avez passé.
  • Ajoute un ensemble arbitraire de propriétés fournies par l'argument objet objet.
  • Définit un horodatage.
  • Marque l'objet "fixe".

Ce que vous obtenez est essentiellement un nouvel objet avec quelques propriétés supplémentaires et une référence à l'événement d'origine – pas de normalisation autre que isDefaultPrevented .

jQuery.event.fix(event) :

  • Ignore les objets qui ont déjà été marqués «réparés».
  • jQuery.Event() une copie inscriptible (par jQuery.Event() ) et normalise les propriétés mentionnées ici .

ETA:

En fait, en regardant de plus près le code, jQuery.event.fix() devrait fonctionner – de la manière décrite par @ Beetroot-Beetroot. C'est tout ce que jQuery fait pour créer l'objet d'événement jQuery dans une dépêche d'événement.

Vous voulez jQuery.event.fix .

new jQuery.Event(nativeEvent)

  • Stocke nativeEvent comme propriété originalEvent .
  • Gère une logique bouillonnante.
  • L'horodatage de l'événement
  • Marque l'événement comme "jQuery a obtenu ceci"
  • Donne toutes les fonctions antibuée / anti-défaut .

Notez à ce stade que l'événement n'a pas de propriétés "eventy", juste originalEvent , timeStamp et les fonctions de timeStamp / défaut.

jQuery.event.fix(nativeEvent)

  • Est-ce que tout ce qui précède
  • Décrit des corrections spécifiques ("crochet de fixation"), il devra s'appliquer en fonction du type d'événement
  • Copies sur un ensemble de propriétés par nativeEvent de nativeEvent , plus spécifiques du crochet de correction
  • Corrige les problèmes de cross-browser avec la target et les propriétés metaKey
  • Applique des corrections et des normalisations spécifiques au navigateur pour le crochet de correction .

Essaye ça:

 document.getElementById('elmtid').onclick = anotherFunction; 

avec:

 function anotherFunction(evt){ evt = $.event.fix(evt || window.event);//Note need for cross-browser reference to the native event ... } 

http://jsfiddle.net/Wrzpb/