class Volt::DocumentEvents
Public Class Methods
new()
click to toggle source
# File lib/volt/page/document_events.rb, line 3 def initialize @events = {} end
Public Instance Methods
add(event, binding, handler)
click to toggle source
# File lib/volt/page/document_events.rb, line 7 def add(event, binding, handler) # Track each document event based on the event, element id, then binding.object_id unless @events[event] # We haven't defined an event of type event yet, lets attach it to the # document. @events[event] = {} that = self document_handler = proc do |*args| handle(event, *args) end ` $('body').on(event, #{document_handler}); ` end @events[event][binding.binding_name] ||= {} @events[event][binding.binding_name][binding.object_id] = handler end
handle(event_name, event, *args)
click to toggle source
# File lib/volt/page/document_events.rb, line 31 def handle(event_name, event, *args) element = `$(event.target || event.originalEvent.target)` loop do # Lookup the handler, make sure to not assume the group # exists. # TODO: Sometimes the event doesn't exist, but we still get # an event. handlers = @events[event_name] element_id = `(element && element[0] && element[0].id) || ''` handlers = handlers[element_id] if handlers if handlers handlers.values.each do |handler| # Call each handler for this object handler.call(event, *args) end end if `element.length` == 0 break else `element = element.parent()` end end nil end
remove(event, binding)
click to toggle source
# File lib/volt/page/document_events.rb, line 62 def remove(event, binding) # Remove the event binding @events[event][binding.binding_name].delete(binding.object_id) # if there are no more handlers for this binding_name (the html id), then # we remove the binding name hash if @events[event][binding.binding_name].size == 0 @events[event].delete(binding.binding_name) end # if there are no more handlers in this event, we can unregister the event # from the document if @events[event].size == 0 @events.delete(event) # Remove the event from the body ` $('body').unbind(event); ` end end