Existe-t’il un moyen d’annuler (à l’image de la méthode unbind
) les effets sur des éléments du DOM d’un plug-in jQuery après son initialisation ?
Il n’existe malheureusement pas de méthode jQuery permettant d’annuler les effets d’un plug-in déjà initialisé, car ce dernier doit exécuter du code spécifique pour nettoyer les manipulations de DOM qu’il a entrainé. Nativement, jQuery ne peut anticiper ce que chaque plug-in va faire.
La méthode destroy
Avant de vous lancer dans des développements compliqués, vérifiez que le plug-in jQuery que vous souhaitez activer/désactiver ne bénéficie pas d’une méthode destroy
. C’est par exemple le cas pour Superfish ou jQuery UI.
Tirer parti des namespaced events
Ajouter et retirer des évènements sur les listeners
(pas testé) addEventListener et nettoyage avec removeEventListener
Encapsuler le plug-in dans une fonction
Encapsuler le plug-in dans une fonction et l’initialiser uniquement lorsque la largeur du viewport correspond à un certain breakpoint. Lorsqu’on sort du breakpoint prédéfini, on recharge la page à l’aide de document.location = document.location;
et le plug-in n’est plus initialisé.
|
function toto() { // mon plug-in } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
jQuery(document).ready(function(){ enquire.register("screen and (max-width: 767px)", { match : function() { jQuery('body').removeClass('is-desktop').addClass('is-mobile'); // ne fais rien }, unmatch : function() { jQuery('body').removeClass('is-mobile').addClass('is-desktop'); // ne fais rien } }); enquire.register("screen and (min-width: 768px)", { match : function() { jQuery('body').removeClass('is-mobile').addClass('is-desktop'); toto(); // initialise toto }, unmatch : function() { jQuery('body').removeClass('is-desktop').addClass('is-mobile'); document.location = document.location; // recharge la page dès que la largeur du viewport est inférieure à 768px } }); }); |
Avantages et inconvénients
- + Nous n’avons ni à ré-écrire des parties du code natif du plug-in, ni à maintenir du code que nous aurions écrit spécifiquement pour pallier aux manipulations de DOM générées par l’initialisation du plug-in.
- + Gain de temps énorme en terme de développement.
- – On recharge la page lorsqu’on change de breakpoint. Si l’utilisateur était en-train de remplir un formulaire à ce moment là, les informations sont perdues.
Nullifier le plug-in
(pas testé) destroy a function in javascript (jquery) – nullify the function
Mettre en cache le DOM sur lequel le plug-in agit avant l’exécution de celui-ci
(pas testé – suggéré dans un fil de discussion stack overflow sans donner d’exemple de code…) One solution may be to cache a pre-plugin .clone() of the element(s) that you could revert back to if/when needed (assuming the plugin doesn’t have « undo » capability).
Activer/Désactiver les handlers d’événements de jQuery (plutôt que d’utiliser les méthodes bind et
unbind)
Enable And Disable jQuery Event Handlers (Rather Than Bind And Unbind) .
Reinitializing NivoSlider after simulating destroy
Ok the best way is to forget about all the destroying thing and replace the silder with it’s initial state. suppose the initial state of silder is:
|
<div id="silder" class="nivoSlider"></div> |
Then the best way to do the destroying and initializing at one step is to do something like:
|
$('#silder').replaceWith('<div id="slider" class="nivoSlider"></div>'); |
Quelques ressources d’intérêt sur le sujet :