diff options
Diffstat (limited to 'actionpack')
-rw-r--r-- | actionpack/CHANGELOG | 2 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/javascript_helper.rb | 9 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/javascripts/prototype.js | 29 |
3 files changed, 40 insertions, 0 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 431686547c..f85f28adb1 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Added JavascriptHelper#periodically_call_remote in order to create areas of a page that update automatically at a set interval #945 [Jon Tirsen] + * Fixed Cache#expire_matched_fragments that couldn't recognize the difference between string and url_for options #1030 [skaes@web.de] * Added simulation of @request.request_uri in functional tests #1038 [Jamis Buck] diff --git a/actionpack/lib/action_view/helpers/javascript_helper.rb b/actionpack/lib/action_view/helpers/javascript_helper.rb index 59765f9737..ba418b15b3 100644 --- a/actionpack/lib/action_view/helpers/javascript_helper.rb +++ b/actionpack/lib/action_view/helpers/javascript_helper.rb @@ -71,6 +71,15 @@ module ActionView link_to_function(name, remote_function(options), html_options) end + # Periodically calls the specified url (<tt>options[:url]</tt>) every <tt>options[:frequency]</tt> seconds (default is 10). + # Usually used to update a specified div (<tt>options[:update]</tt>) with the results of the remote call. + # The options for specifying the target with :url and defining callbacks is the same as link_to_remote. + def periodically_call_remote(options = {}) + frequency = options[:frequency] || 10 # every ten seconds by default + code = "new PeriodicalExecuter(function() {#{remote_function(options)}}, #{frequency})" + content_tag("script", code, options[:html_options] || {}) + end + # Returns a form tag that will submit using XMLHttpRequest in the background instead of the regular # reloading POST arrangement. Even though it's using Javascript to serialize the form elements, the form submission # will work just like a regular submission as viewed by the receiving side (all elements available in @params). diff --git a/actionpack/lib/action_view/helpers/javascripts/prototype.js b/actionpack/lib/action_view/helpers/javascripts/prototype.js index 5dc41e36dd..1ab50882c4 100644 --- a/actionpack/lib/action_view/helpers/javascripts/prototype.js +++ b/actionpack/lib/action_view/helpers/javascripts/prototype.js @@ -613,3 +613,32 @@ Effect.Appear.prototype = { } } +/*--------------------------------------------------------------------------*/ + +PeriodicalExecuter = Class.create(); +PeriodicalExecuter.prototype = { + initialize: function(what, frequency) { + this.what = what; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function() { + setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.what(); + } finally { + this.currentlyExecuting = false; + } + } + + this.registerCallback(); + } +} |