Sha256: a4847f44fe93d9719291d1742486e74823f7ee6d829f100e0fe742cc816d5b71

Contents?: true

Size: 1.97 KB

Versions: 34

Compression:

Stored size: 1.97 KB

Contents

module Volt
  class DocumentEvents
    def initialize
      @events = {}
    end

    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

        `
        $('body').on(event, function(e) {
          that.$handle(event, e, e.target || e.originalEvent.target);
        });
      `

      end

      @events[event][binding.binding_name]                    ||= {}
      @events[event][binding.binding_name][binding.object_id] = handler
    end

    def handle(event_name, event, target)
      element = Element.find(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]
        handlers = handlers[element.id] if handlers

        if handlers
          handlers.values.each do |handler|
            # Call each handler for this object
            handler.call(event)
          end
        end

        if element.size == 0
          break
        else
          element = element.parent
        end
      end

      nil
    end

    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
  end
end

Version data entries

34 entries across 34 versions & 1 rubygems

Version Path
volt-0.9.1.pre4 lib/volt/page/document_events.rb
volt-0.9.1.pre3 lib/volt/page/document_events.rb
volt-0.9.1.pre2 lib/volt/page/document_events.rb
volt-0.9.1.pre1 lib/volt/page/document_events.rb
volt-0.9.0 lib/volt/page/document_events.rb
volt-0.9.0.pre7 lib/volt/page/document_events.rb
volt-0.9.0.pre6 lib/volt/page/document_events.rb
volt-0.9.0.pre5 lib/volt/page/document_events.rb
volt-0.9.0.pre4 lib/volt/page/document_events.rb
volt-0.9.0.pre3 lib/volt/page/document_events.rb
volt-0.9.0.pre2 lib/volt/page/document_events.rb
volt-0.9.0.pre1 lib/volt/page/document_events.rb
volt-0.8.27.beta9 lib/volt/page/document_events.rb
volt-0.8.27.beta8 lib/volt/page/document_events.rb
volt-0.8.27.beta7 lib/volt/page/document_events.rb
volt-0.8.27.beta6 lib/volt/page/document_events.rb
volt-0.8.27.beta5 lib/volt/page/document_events.rb
volt-0.8.27.beta4 lib/volt/page/document_events.rb
volt-0.8.27.beta3 lib/volt/page/document_events.rb
volt-0.8.27.beta2 lib/volt/page/document_events.rb