Module: ActionView::Helpers::JavaScriptHelper

Included in:
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 '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.

Instance Method Summary collapse

Instance Method Details

#button_to_function(name, *args, &block) ⇒ Object

Returns a button that’ll trigger a JavaScript function using the onclick handler.

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).

Examples:

button_to_function "Greeting", "alert('Hello world!')"
button_to_function "Delete", "if (confirm('Really?')) do_delete()"


72
73
74
75
76
77
78
79
80
81
# File 'lib/action_view/helpers/javascript_helper.rb', line 72

def button_to_function(name, *args, &block)
  html_options = args.extract_options!.symbolize_keys
  function = args[0] || ''

  function = update_page(&block) if block_given?
  tag(:input, html_options.merge({ 
    :type => "button", :value => name, 
    :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function};" 
  }))
end

#escape_javascript(javascript) ⇒ Object

Escape carrier returns and single and double quotes for JavaScript segments.



84
85
86
# File 'lib/action_view/helpers/javascript_helper.rb', line 84

def escape_javascript(javascript)
  (javascript || '').gsub('\\','\0\0').gsub('</','<\/').gsub(/\r\n|\n|\r/, "\\n").gsub(/["']/) { |m| "\\#{m}" }
end

#javascript_cdata_section(content) ⇒ Object

:nodoc:



124
125
126
# File 'lib/action_view/helpers/javascript_helper.rb', line 124

def javascript_cdata_section(content) #:nodoc:
  "\n//#{cdata_section("\n#{content}\n//")}\n"
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 -%>


107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/action_view/helpers/javascript_helper.rb', line 107

def javascript_tag(content_or_options_with_block = nil, html_options = {}, &block)
  if block_given?
    html_options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
    content = capture(&block)
  else
    content = content_or_options_with_block
  end

  javascript_tag = ("script", javascript_cdata_section(content), html_options.merge(:type => Mime::JS))
  
  if block_given? && block_is_within_action_view?(block)
    concat(javascript_tag, block.binding)
  else
    javascript_tag
  end
end

Returns a link that will trigger a JavaScript function using the onclick handler and return false after the fact.

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).

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>


48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/action_view/helpers/javascript_helper.rb', line 48

def link_to_function(name, *args, &block)
  html_options = args.extract_options!.symbolize_keys
  function = args[0] || ''

  function = update_page(&block) if block_given?
  (
    "a", name, 
    html_options.merge({ 
      :href => html_options[:href] || "#", 
      :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function}; return false;" 
    })
  )
end