Une très bonne question ... j'ai été intrigué donc j'ai fait un peu de creuser; pour ceux qui sont intéressés, c'est ici où je suis allé, et que je suis venu avec.
En regardant le code source de jQuery 1.4.2 j'ai vu ce bloc entre les lignes 2361 et 2392:
jQuery.each(["bind", "one"], function( i, name ) {
jQuery.fn[ name ] = function( type, data, fn ) {
// Handle object literals
if ( typeof type === "object" ) {
for ( var key in type ) {
this[ name ](key, data, type[key], fn);
}
return this;
}
if ( jQuery.isFunction( data ) ) {
fn = data;
data = undefined;
}
var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
jQuery( this ).unbind( event, handler );
return fn.apply( this, arguments );
}) : fn;
if ( type === "unload" && name !== "one" ) {
this.one( type, data, fn );
} else {
for ( var i = 0, l = this.length; i < l; i++ ) {
jQuery.event.add( this[i], type, handler, data );
}
}
return this;
};
});
Il y a beaucoup de choses intéressantes qui se passe ici, mais la partie qui nous intéresse est entre les lignes 2384 et 2388:
else {
for ( var i = 0, l = this.length; i < l; i++ ) {
jQuery.event.add( this[i], type, handler, data );
}
}
Chaque fois que nous appelons bind()
ou one()
nous sommes en fait de faire un appel à l' jQuery.event.add()
... donc, nous allons jeter un oeil à ce que (les lignes de 1557 à 1672, si vous êtes intéressé)
add: function( elem, types, handler, data ) {
// ... snip ...
var handleObjIn, handleObj;
if ( handler.handler ) {
handleObjIn = handler;
handler = handleObjIn.handler;
}
// ... snip ...
// Init the element's event structure
var elemData = jQuery.data( elem );
// ... snip ...
var events = elemData.events = elemData.events || {},
eventHandle = elemData.handle, eventHandle;
if ( !eventHandle ) {
elemData.handle = eventHandle = function() {
// Handle the second event of a trigger and when
// an event is called after a page has unloaded
return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
jQuery.event.handle.apply( eventHandle.elem, arguments ) :
undefined;
};
}
// ... snip ...
// Handle multiple events separated by a space
// jQuery(...).bind("mouseover mouseout", fn);
types = types.split(" ");
var type, i = 0, namespaces;
while ( (type = types[ i++ ]) ) {
handleObj = handleObjIn ?
jQuery.extend({}, handleObjIn) :
{ handler: handler, data: data };
// Namespaced event handlers
^
|
// There is is! Even marked with a nice handy comment so you couldn't miss it
// (Unless of course you are not looking for it ... as I wasn't)
if ( type.indexOf(".") > -1 ) {
namespaces = type.split(".");
type = namespaces.shift();
handleObj.namespace = namespaces.slice(0).sort().join(".");
} else {
namespaces = [];
handleObj.namespace = "";
}
handleObj.type = type;
handleObj.guid = handler.guid;
// Get the current list of functions bound to this event
var handlers = events[ type ],
special = jQuery.event.special[ type ] || {};
// Init the event handler queue
if ( !handlers ) {
handlers = events[ type ] = [];
// ... snip ...
}
// ... snip ...
// Add the function to the element's handler list
handlers.push( handleObj );
// Keep track of which events have been used, for global triggering
jQuery.event.global[ type ] = true;
}
// ... snip ...
}
À ce moment, j'ai réalisé que la compréhension de ce qui se passait à durer plus de 30 minutes ... j'ai donc cherché à Stackoverflow pour
jquery get a list of all event handlers bound to an element
et trouvé cette réponse pour parcourir lié aux événements:
//log them to the console (firebug, ie8)
console.dir( $('#someElementId').data('events') );
//or iterate them
jQuery.each($('#someElementId').data('events'), function(i, event){
jQuery.each(event, function(i, handler){
console.log( handler.toString() );
});
});
Les tests que dans Firefox, je vois que l' events
objet dans l' data
attribut de chaque élément a un [some_event_name]
d'attribut (click
dans notre cas) pour ce qui est attatched un tableau d' handler
objets, dont chacun a un guid, d'un espace de nom, un type et un gestionnaire. "Donc", je pense", on devrait théoriquement être en mesure d'ajouter des objets construits de la même manière à l' [element].data.events.[some_event_name].push([our_handler_object);
... "
Et puis je vais terminer la rédaction de mes découvertes ... et de trouver une bien meilleure réponse posté par RusselUresti ... qui me présente à quelque chose de nouveau que je ne savais pas à propos de jQuery (même si j'ai été regarder dans le visage).
Qui est la preuve que Stackoverflow est le meilleur de questions-réponses sur le site internet, au moins, à mon humble avis.
Donc je poste ceci dans un souci de postérité ... et en marquant un wiki de la communauté, depuis RussellUresti déjà répondu à la question tellement bien.