jQuery évènements stopScroll et stopResize
Encore une fois un besoin qui devrait être par défaut dans jQuery mais qui se customize plutôt bien: avoir des évènements stopScroll et stopResize qui nous indique quand cette opération est terminée plutôt qu'en temps réel.
En utilisant l'api de jQuery des special events on peut enregistrer nos propres évènements qui sont du coup valable avec bind par exemple.
Là l'idée c'est de pouvoir dire par exemple :
$(window).bind('stopresize', function() { alert('ok il a finit de toucher sa souris tu peux y aller ...'); });
Et pareil avec le scroll. Je m'en sert pour faire suivre un skycraper le long de la page, ou pour l'afficher désafficher en fonction de la taille de la page en largeur ... mais si on le fait en temps réel d'une ça plombe les perf, le navigateur rame, et de deux si on utilise des animations il en fait des files et le truc s'arrête plus jamais de bouger ...
Donc voila la solution toute cuite qui marche très bien : (ça marche avec une latence qu'on peut régler par évènement, donc a vous de jouer là)
(function(){ var special = jQuery.event.special, uid1 = 'D' + (+new Date()), uid2 = 'D' + (+new Date() + 1); special.resizestop = { latency: 300, setup: function() { var timer, handler = function(evt) { var _self = this, _args = arguments; if (timer) { clearTimeout(timer); } timer = setTimeout( function(){ timer = null; evt.type = 'resizestop'; jQuery.event.handle.apply(_self, _args); }, special.resizestop.latency); }; jQuery(this).bind('resize', handler).data(uid1, handler); }, teardown: function() { jQuery(this).unbind('resize', jQuery(this).data(uid1) ); } }; special.scrollstop = { latency: 300, setup: function() { var timer, handler = function(evt) { var _self = this, _args = arguments; if (timer) { clearTimeout(timer); } timer = setTimeout( function(){ timer = null; evt.type = 'scrollstop'; jQuery.event.handle.apply(_self, _args); }, special.scrollstop.latency); }; jQuery(this).bind('scroll', handler).data(uid2, handler); }, teardown: function() { jQuery(this).unbind('scroll', jQuery(this).data(uid2) ); } }; })();
