2010-11-03 7 views
2

je utiliser un plugin jQuery qui doit enregistrer un gestionnaire d'événements, cliquez sur:Enregistrer une fonction avec un événement seulement une fois?

$.fn.myPlugin = function (options) { 
    var settings = { 
     // snipped 
    }; 
    $.extend(settings, options || {}); 

    $("body").click(function() { 
     // Do Something 
    }); 

    // Rest of the plugin 
}); 

Le problème est que plusieurs invocations enregistrent la fonction plus d'une fois. Comme la fonction doit rester attachée, je ne peux pas utiliser .one().

Y at-il un moyen si une fonction est déjà attachée? Puis-je lui donner un nom ou quoi? Ou dois-je définir un drapeau booléen en utilisant la magie de fermeture?

+1

Hehe, voir http://bugs.jquery.com/ticket/6222 –

Répondre

3

Namespace vos événements.

$('body').unbind('click.myPlugin').bind('click.myPlugin', function() { 
    ..code... 
}); 

More on Namespaced Events.

+0

A travaillé comme un charme! Cela me permet essentiellement de me référer à mes événements avec un nom, ce qui supprime toute ambiguïté. –

+0

Je suis content que cela ait fonctionné :) –

+0

Juste comme un rappel pour ceux à suivre: Il est important d'utiliser la syntaxe click.XXX pour que jQuery le lie toujours à l'événement click. J'ai utilisé myPlugin.doClick et myPlugin.click et cela n'a pas fonctionné. Évident avec le recul, mais m'a causé quelques minutes d'ennuis :) –

1

Une méthode très facile avec une bonne performance serait de mettre un élément de données sur l'élément body:

if (!$.data(document.body, 'myPluginRegistered') { 
    $.data(document.body, 'myPluginRegistered', true); 

    // do your plugin code here 
} 
+0

@downvoter Un commentaire serait bien ... – lonesomeday

+0

Juste pour le compte rendu, n'est-ce pas moi qui l'a rabaissé. On pourrait dire que c'est juste une variable globale fantaisiste, mais c'est exactement ce qu'elle est supposée être: un marqueur sur un élément. –

0

Le plus simple pourrait être la magie booléenne plus la fermeture que vous avez suggérée. Alternativement, vous pouvez obtenir la liste de toutes les fonctions liées à l'objet "click", et voir si la fonction que vous attachez est déjà là.

Cette question montre comment obtenir la liste.

List all javascript events wired up on a page using jquery

Bien que, la suggestion d'espace de noms qui est arrivé après la première est probablement plus simple répondu.

Questions connexes