Create Custom Element Property Getters and Setters with MooTools

By  on  

One of the goals of the MooTools projects is to create very flexible methods by which developers may modify or extend the behavior of given classes. One example of that flexibility is the ability to customize the Element class' get and set methods for specified values.

The default behavior of the get and set methods for an object are to return/modify the given Element attribute. Take the following for example:

var alt ='myImage').get('title');  //returns the image's title attribute text

The above code modifies the title attribute for the given element. Simple, of course, but then MooTools also uses the get/set methods to set and retrieve items that aren't element attributes:

var tag ='myImage').get('tag'); //returns images's tag (img)

The above code retrieves the given element's tag name. How does MooTools do this? Simple: the Element.Properties object. You can set custom get and set handling by adding your desired string to the Element.Properties object. Here's an example:

Element.Properties.yourCustomGetOrSetName = {
	get: function() {
		//your custom programming to accomplish what should be returned...
		return yourReturnValue;
	set: function(input) {
		//your custom programming to accomplish what should be set...
		//don't need to return anything
	erase: function() { //erase works too!
		//programming to erase this

Here's the code MooTools uses internally to accomplish the get('tag') ability:

Element.Properties.tag = {
	get: function(){
		return this.tagName.toLowerCase();

So how could you use this? You could use Element.Properties to create a parent getter:

Element.Properties.parent = {
	get: function() {
		return this.getParent(); //returns the element's parent
	//no need to do a setter or eraser
var parent ='myElement').get('parent'); //returns myElement's parent element.

Pretty sweet, no? Have any other items you'd like to see in the get or set methods? Share!

Recent Features

  • By
    Designing for Simplicity

    Before we get started, it's worth me spending a brief moment introducing myself to you. My name is Mark (or @integralist if Twitter happens to be your communication tool of choice) and I currently work for BBC News in London England as a principal engineer/tech...

  • By
    5 Ways that CSS and JavaScript Interact That You May Not Know About

    CSS and JavaScript:  the lines seemingly get blurred by each browser release.  They have always done a very different job but in the end they are both front-end technologies so they need do need to work closely.  We have our .js files and our .css, but...

Incredible Demos

  • By
    Rotate Elements with CSS Transformations

    I've gone on a million rants about the lack of progress with CSS and how I'm happy that both JavaScript and browser-specific CSS have tried to push web design forward. One of those browser-specific CSS properties we love is CSS transformations. CSS transformations...

  • By
    “Top” Watermark Using MooTools

    Whenever you have a long page worth of content, you generally want to add a "top" anchor link at the bottom of the page so that your user doesn't have to scroll forever to get to the top. The only problem with this method is...


  1. I was asking yesterday on the mootools irc channel if there is a way to add a property to css properties so I can do something similar, tweening -webkit-box-shadow and -moz-box-shadow, only using one property, like this:

    el.tween('box-shadow', xxx);

    Do you know if this is possible?

  2. Bill

    How do I get just the parent id, not the parent?

  3. @Bill: Like this:

    var parent ='myElement').get('parent').get('id');

  4. I know this article was from a while ago, but I’ve just discovered it and it is relevant to something I have been attempting recently.

    You asked if there are any other items we would like in the properties set and my suggestion is this:

    Element.Properties.children = {
        get: function() { 
            return this.getChildren();
        set: function(value) {

    which would then allow you to instantiate more complex Element hierarchies as follows:

    new Element('div.background', { children: [
        new Element('div.container', { children: [
            new Element('div.window', { children: [ 
                new Element('h1', { text: 'A title' }),
                new Element('div.content'),
                new Element('', { children: [
                    new Element('button', { text: 'OK', events: { ... }}),
                    new Element('button', { text: 'Cancel', events: { ... }})

    With this you can easily see (and modify) the hierarchy instead of having to follow through all of the inject/adopt/grab calls.


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