Supporting the onMessage Event in MooTools

By  on  

Yesterday I threw some window.postMessage knowledge right in your face.  The cross frame/window/domain technology that is window.postMessage is really interesting and as IE6 and IE7 fade away, window.postMessage will gain more momentum.  In looking to listen to onMessage events with MooTools, I noticed that message events aren't  handled properly.  The event type is seen as message but the event.data, event.source, and event.origin aren't added to the main-level object -- they're relegated to event.event.  It's time to fix that using MooTools custom events.

The MooTools JavaScript

Element.NativeEvents.message = 2;
Element.Events.message = {
	base: 'message',
	condition: function(event) {
		//if(event.type == 'message') {
		if(!event.$message_extended) {
			event.data = event.event.data;
			event.source = event.event.source;
			event.origin = event.event.origin;
			event.$message_extended = true;
		}
		return true;
	}
};

Regardless of whether or not the event type is within the Element.NativeEvents.message object, its value always matches what's provided by the browser, minus the "on" prefix.  With that in mind, creating a "custom" message event with "message" as the base is the way to go.  The condition portion of the custom event is met by the type being "message," so the only check is that the event hasn't been handled already.  If the condition is met, I move references to the data, origin, and source to the event object's first level to mimic the tradition message event. As an added bonus, if existing properties are undefined, I set their value to false.

The power of custom MooTools events is awesome.  window.onMessage is rarely used due to IE6 and IE7's crap and the lack of use case so onMessage may not be worth adding the code to Core.  If you do, however, need this functionality...here you go!

Recent Features

  • By
    CSS Animations Between Media Queries

    CSS animations are right up there with sliced bread. CSS animations are efficient because they can be hardware accelerated, they require no JavaScript overhead, and they are composed of very little CSS code. Quite often we add CSS transforms to elements via CSS during...

  • By
    Being a Dev Dad

    I get asked loads of questions every day but I'm always surprised that they're rarely questions about code or even tech -- many of the questions I get are more about non-dev stuff like what my office is like, what software I use, and oftentimes...

Incredible Demos

  • By
    MooTools Font-Size Scroller with Cookie Save

    Providing users as many preferences as possible always puts a smile on the user's face. One of those important preferences is font size. I can see fine but the next guy may have difficulty with the font size I choose. That's why...

  • By
    prefers-color-scheme: CSS Media Query

    One device and app feature I've come to appreciate is the ability to change between light and dark modes. If you've ever done late night coding or reading, you know how amazing a dark theme can be for preventing eye strain and the headaches that result.

Discussion

  1. I was entirely confused why window.addEvent( 'message', function(event) { ... }) was not working.
    This plugin is exactly what I needed, and now I know about Element.Events. Thanks!

    I am confused by the code comment //if(event.type == 'message') { and your post The condition portion of the custom event is met by the type being “message,” so the only check is that the event hasn’t been handled already..

    Is it necessary to check the type of the event when using MooTools custom events?
    Or, on the other hand, can I just remove that comment?

  2. What is the purpose of setting undefined values to false?

    for(key in event) {
        if(event[key] == undefined) {
            event[key] = false;
    }
    

    This modifies, for example, the alt, client, page, relatedTarget properties of the event object.

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!