Hello,

Before 1.6, I had a set of functions on top of the Event.observe
family of functions, which dealt with registering callbacks for
events, like this:

  signalConnect: function(element, name, observer) {
    if (!element || !name || !observer) return;
    if (!element.signals) element.signals = {};
    if (!element.signals[name])
      element.signals[name] = {observers: [], callbacks: []};
    if (element.signals[name].observers.indexOf(observer) > -1) return
Event;

    var custom = Event.custom[name];
    if (custom) {
      var real = custom.real;
      var callback = custom.callback ?
custom.callback.bindAsEventListener(Event, element) : null;
      if (custom.connect) custom.connect.call(Event, element,
observer);
    }

    element.signals[name].observers.push(observer);
    element.signals[name].callbacks.push(callback || observer);
    if ((real || name) != 'activate')
      Event.observe.call(Event, element, real || name, callback ||
observer);
    return Event;
  },

I needed that, since I needed to be able to disconnect all handlers
for a particular signal, and then I added generic events for elements,
like mousewheel and mouseenter, much akin to the mootools library.

With the current release candidate, most of my code has been made
obsolete, and I'm trying to reduce it to to point of my functions
calling the prototype ones. However, there's still the issue of having
support for global element events, like 'mousewheel', 'mouseenter',
and 'mouseout', that would work with all elements, and reuse existing
event names to achieve their function. Is there a structure somewhere
in the latest prototype that will let me add those, or can they be
added before the final release?

the custom events were implemented using the following fashion:
  custom: {
    mouseenter: {
      real: 'mouseover',
      callback: function(event, element) {
        var target = Event.relatedElement(event);
        if (target == element || Element.descendantOf(target, element))
return;
        Event.emitSignal(element, 'mouseenter', event);
      }
    },
    mouseleave: {
      real: 'mouseout',
      callback: function(event, element) {
        var target = Event.relatedElement(event);
        if (target == element || Element.descendantOf(target, element))
return;
        Event.emitSignal(element, 'mouseleave', event);
      }
    },
    mousewheel: {
      real: (Prototype.Browser.Gecko) ? 'DOMMouseScroll' :
'mousewheel',
      callback: function(event, element) {
        if (event.detail)
          event.scrollDirection = event.detail;
        else if (event.wheelDelta)
          event.scrollDirection = event.wheelDelta / -40;
        Event.emitSignal(element, 'mousewheel', event);
      }
    },
    domready: {
      connect: function(element, observer) {
        if (window.loaded) {
          observer.call(element);
        }
        if (document.readyState && (Prototype.Browser.WebKit ||
Prototype.Browser.KHTML)) {
          window.domreadytimer = setInterval(function() {
            if (['loaded', 'complete'].include(document.readyState))
              Event.custom.domready._callback(element);
          }, 50);
        } else if (document.readyState && Prototype.Browser.IE) {
          if (!$('iedomready')) {
            var src = (window.location.protocol == 'https:') ? '://0' :
'javascript:void(0)';
            document.write('<script id="iedomready" defer src="' + src + '"></
script>');
            $('iedomready').onreadystatechange = function() {
              if (this.readyState == 'complete')
Event.custom.domready._callback(element);
            };
          }
        } else {
          Event.observe(window, 'load',
Event.custom.domready._callback.bind(Event, element));
          Event.observe(document, 'DOMContentLoaded',
Event.custom.domready._callback.bind(Event, element));
        }
      },
      _callback: function(element) {
        if (window.loaded) return;
        window.loaded = true;
        clearInterval(window.domreadytimer);
        window.domreadytimer = null;
        Event.emitSignal(element, 'domready');
      }
    }
  }

they are pretty much a translation from the mootools ones, and are
made to work with prototype (the mousewheel one has a few additions).


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Prototype: Core" group.
To post to this group, send email to prototype-core@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/prototype-core?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to