Just to add another use case of such methods... I recently wrote a delayed mousemove special event that does similar functionality. I plan on extracting the throttle/debounce functionality into its own plugin for use-cases such as this ajax one. -- Brandon Aaron
On Sat, Mar 28, 2009 at 1:53 AM, oliver <[email protected]> wrote: > > Quick passes: > > jQuery.delay = function(callback, delay) { > var timeout; > return function() { > clearTimeout(timeout); > timeout = setTimeout(callback, delay); > } > } > > jQuery.throttle = function(callback, delay) { > var prev = new Date().getTime() - delay; > return function() { > var now = new Date().getTime(); > if (now - prev > delay) { > prev = now; > callback.call(); > } > } > } > > > On Mar 27, 11:38 pm, oliver <[email protected]> wrote: > > I agree that this is a common use case, and also that it would be > > better implemented as an optional parameter to ajax rather than a > > wholly separate method. > > > > I find I also use similar code within animations, so perhaps the code > > could be implemented in such a way as to also be exposed as a utility > > function. > > > > Perhaps: $.delay(function, delay) - returns a function handler which > > can be called many times, but the registered function will only fire > > once, [delay] milliseconds after the last time it was called. The > > innards of the function would be mostly as Miloš has above. > > > > A potentially useful corollary might be: $.throttle(function, delay) - > > returns a function handler which could be called as many times as > > desired, but the registered function would only fire every [delay] > > millis at most. > > > > Names are just off the top of my head, of course. > > > > oliver > > > > On Mar 27, 3:27 pm, Daniel Friesen <[email protected]> wrote: > > > > > > > > > Rather than an entire other function, what about just a {delay: ms} to > .ajax > > > > > ~Daniel Friesen (Dantman, Nadir-Seen-Fire) > > > > > Miloš Rašić wrote: > > > > Here's a suggestion for a feature that I think would be useful to > AJAX > > > > developers. Sometimes, we need an AJAX feature that could allow a > user > > > > to cause a large number of consequent AJAX requests, for example in > > > > auto-complete for searches (like Google Suggest) or filter forms that > > > > submit whenever something is changed in them. In a case like this, > > > > especially when the user has a slow internet connection, we have no > > > > way of knowing if the AJAX responses will arrive in the same order as > > > > the requests were sent. A solution to this is to wait for some time > to > > > > make sure that the user has stopped manipulating the controls that > > > > cause AJAX requests before sending a request. At the moment, I do it > > > > like this: > > > > > > function submit_filter() { > > > > $('#item_list').html('loading...'); > > > > $.post('some url',$('#filter').serialize(),function(data) > { > > > > $('#item_list').html(data); > > > > }); > > > > return false; > > > > } > > > > > > $('.ajax_control').change(function() { > > > > clearTimeout(ajaxTimeout); > > > > ajaxTimeout = setTimeout(submit_filter,2000); > > > > }); > > > > > > Basically, whenever a control is changed a timeout for ajax request > is > > > > reset to 2 seconds. A request is sent only when a user changes > > > > something an hasn't made new changes last 2 seconds. > > > > > > Since this is a frequent use case, it would be great if there would > be > > > > a $.post_delayed() function which would have additional 2 parameters: > > > > an id, which would be used to identify related controls, and a time > > > > interval to wait before submitting the request. > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "jQuery Development" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/jquery-dev?hl=en -~----------~----~----~----~------~----~------~--~---
