Module: ActionView::Helpers::JavaScriptHelper
- Includes:
- PrototypeHelper
- Included in:
- ActionView::Helpers, UrlHelper
- Defined in:
- lib/action_view/helpers/javascript_helper.rb
Overview
Provides functionality for working with JavaScript in your views.
Ajax, controls and visual effects
-
For information on using Ajax, see ActionView::Helpers::PrototypeHelper.
-
For information on using controls and visual effects, see ActionView::Helpers::ScriptaculousHelper.
Including the JavaScript libraries into your pages
Rails includes the Prototype JavaScript framework and the Scriptaculous JavaScript controls and visual effects library. If you wish to use these libraries and their helpers (ActionView::Helpers::PrototypeHelper and ActionView::Helpers::ScriptaculousHelper), you must do one of the following:
-
Use
<%= javascript_include_tag :defaults %>
in the HEAD section of your page (recommended): This function will return references to the JavaScript files created by therails
command in yourpublic/javascripts
directory. Using it is recommended as the browser can then cache the libraries instead of fetching all the functions anew on every request. -
Use
<%= javascript_include_tag 'prototype' %>
: As above, but will only include the Prototype core library, which means you are able to use all basic AJAX functionality. For the Scriptaculous-based JavaScript helpers, like visual effects, autocompletion, drag and drop and so on, you should use the method described above.
For documentation on javascript_include_tag
see ActionView::Helpers::AssetTagHelper.
Constant Summary collapse
- JAVASCRIPT_PATH =
File.join(File.dirname(__FILE__), 'javascripts')
- JS_ESCAPE_MAP =
{ '\\' => '\\\\', '</' => '<\/', "\r\n" => '\n', "\n" => '\n', "\r" => '\n', '"' => '\\"', "'" => "\\'" }
Constants included from PrototypeHelper
PrototypeHelper::AJAX_OPTIONS, PrototypeHelper::CALLBACKS
Instance Method Summary collapse
-
#button_to_function(name, *args, &block) ⇒ Object
Returns a button with the given
name
text that’ll trigger a JavaScriptfunction
using the onclick handler. -
#escape_javascript(javascript) ⇒ Object
Escape carrier returns and single and double quotes for JavaScript segments.
-
#javascript_cdata_section(content) ⇒ Object
:nodoc:.
-
#javascript_tag(content_or_options_with_block = nil, html_options = {}, &block) ⇒ Object
Returns a JavaScript tag with the
content
inside. -
#link_to_function(name, *args, &block) ⇒ Object
Returns a link of the given
name
that will trigger a JavaScriptfunction
using the onclick handler and return false after the fact.
Methods included from PrototypeHelper
#button_to_remote, #evaluate_remote_response, #form_remote_tag, #link_to_remote, #observe_field, #observe_form, #periodically_call_remote, #remote_form_for, #remote_function, #submit_to_remote, #update_page, #update_page_tag
Instance Method Details
#button_to_function(name, *args, &block) ⇒ Object
Returns a button with the given name
text that’ll trigger a JavaScript function
using the onclick handler.
The first argument name
is used as the button’s value or display text.
The next arguments are optional and may include the javascript function definition and a hash of html_options.
The function
argument can be omitted in favor of an update_page
block, which evaluates to a string when the template is rendered (instead of making an Ajax request first).
The html_options
will accept a hash of html attributes for the link tag. Some examples are :class => “nav_button”, :id => “articles_nav_button”
Note: if you choose to specify the javascript function in a block, but would like to pass html_options, set the function
parameter to nil
Examples:
"Greeting", "alert('Hello world!')"
"Delete", "if (confirm('Really?')) do_delete()"
"Details" do |page|
page[:details].visual_effect :toggle_slide
end
"Details", :class => "details_button" do |page|
page[:details].visual_effect :toggle_slide
end
122 123 124 125 126 127 128 129 |
# File 'lib/action_view/helpers/javascript_helper.rb', line 122 def (name, *args, &block) = args..symbolize_keys function = block_given? ? update_page(&block) : args[0] || '' onclick = "#{"#{[:onclick]}; " if [:onclick]}#{function};" tag(:input, .merge(:type => 'button', :value => name, :onclick => onclick)) end |
#escape_javascript(javascript) ⇒ Object
Escape carrier returns and single and double quotes for JavaScript segments.
141 142 143 144 145 146 147 |
# File 'lib/action_view/helpers/javascript_helper.rb', line 141 def escape_javascript(javascript) if javascript javascript.gsub(/(\\|<\/|\r\n|[\n\r"'])/) { JS_ESCAPE_MAP[$1] } else '' end end |
#javascript_cdata_section(content) ⇒ Object
:nodoc:
186 187 188 |
# File 'lib/action_view/helpers/javascript_helper.rb', line 186 def javascript_cdata_section(content) #:nodoc: "\n//#{cdata_section("\n#{content}\n//")}\n".html_safe end |
#javascript_tag(content_or_options_with_block = nil, html_options = {}, &block) ⇒ Object
Returns a JavaScript tag with the content
inside. Example:
javascript_tag "alert('All is good')"
Returns:
<script type="text/javascript">
//<![CDATA[
alert('All is good')
//]]>
</script>
html_options
may be a hash of attributes for the <script> tag. Example:
javascript_tag "alert('All is good')", :defer => 'defer'
# => <script defer="defer" type="text/javascript">alert('All is good')</script>
Instead of passing the content as an argument, you can also use a block in which case, you pass your html_options
as the first parameter.
<% javascript_tag :defer => 'defer' do -%>
alert('All is good')
<% end -%>
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
# File 'lib/action_view/helpers/javascript_helper.rb', line 168 def javascript_tag( = nil, = {}, &block) content = if block_given? = if .is_a?(Hash) capture(&block) else end tag = content_tag(:script, javascript_cdata_section(content), .merge(:type => Mime::JS)) if block_called_from_erb?(block) concat(tag) else tag end end |
#link_to_function(name, *args, &block) ⇒ Object
Returns a link of the given name
that will trigger a JavaScript function
using the onclick handler and return false after the fact.
The first argument name
is used as the link text.
The next arguments are optional and may include the javascript function definition and a hash of html_options.
The function
argument can be omitted in favor of an update_page
block, which evaluates to a string when the template is rendered (instead of making an Ajax request first).
The html_options
will accept a hash of html attributes for the link tag. Some examples are :class => “nav_button”, :id => “articles_nav_button”
Note: if you choose to specify the javascript function in a block, but would like to pass html_options, set the function
parameter to nil
Examples:
link_to_function "Greeting", "alert('Hello world!')"
Produces:
<a onclick="alert('Hello world!'); return false;" href="#">Greeting</a>
link_to_function(image_tag("delete"), "if (confirm('Really?')) do_delete()")
Produces:
<a onclick="if (confirm('Really?')) do_delete(); return false;" href="#">
<img src="/images/delete.png?" alt="Delete"/>
</a>
link_to_function("Show me more", nil, :id => "more_link") do |page|
page[:details].visual_effect :toggle_blind
page[:more_link].replace_html "Show me less"
end
Produces:
<a href="#" id="more_link" onclick="try {
$("details").visualEffect("toggle_blind");
$("more_link").update("Show me less");
}
catch (e) {
alert('RJS error:\n\n' + e.toString());
alert('$(\"details\").visualEffect(\"toggle_blind\");
\n$(\"more_link\").update(\"Show me less\");');
throw e
};
return false;">Show me more</a>
88 89 90 91 92 93 94 95 96 |
# File 'lib/action_view/helpers/javascript_helper.rb', line 88 def link_to_function(name, *args, &block) = args..symbolize_keys function = block_given? ? update_page(&block) : args[0] || '' onclick = "#{"#{[:onclick]}; " if [:onclick]}#{function}; return false;" href = [:href] || '#' content_tag(:a, name, .merge(:href => href, :onclick => onclick)) end |