O'Reilly

Create a Custom “:selected” Pseudo Selector in MooTools

By on  

A while back I read a very interesting article by MooTools core developer Jan Kassens about how to create a custom pseudo selector in MooTools. I was surprised at the ease in which one can add their own pseudo selector that I thought I'd add a pseudo selector that I found useful in jQuery: :selected. This pseudo selector would return option elements that are selected. Here's how I did it:

The XHTML

<select name="mysel" id="mysel" multiple="multiple">
	<option value="One">One</a>
	<option value="Two">Two</a>
	<option value="Three" selected="selected">Three</a>
	<option value="Four" selected="selected">Four</a>
</select>

A basic select element that allows for multiple selections and has two elements selected by default.

The MooTools Custom Pseudo Selector

	Selectors.Pseudo.selected = function(){
		return (this.selected && 'option' == this.get('tag'));
	};

MooTools has an internal "Selectors.Pseudo" variable so all I needed to do was add a selected property. That property is a function that returns whether an individual returned elements should be added to the collection. In this case, if the element has the selected property as true, the element should be returned. Using my example above, the 2 matching elements will be returned.

What other pseudo selectors do you think would be useful in MooTools? Please share!

O'Reilly Velocity Conference
Save 20% with discount code AFF20

Recent Features

  • Serving Fonts from CDN

    For maximum performance, we all know we must put our assets on CDN (another domain).  Along with those assets are custom web fonts.  Unfortunately custom web fonts via CDN (or any cross-domain font request) don't work in Firefox or Internet Explorer (correctly so, by spec) though...

  • Write Simple, Elegant and Maintainable Media Queries with Sass

    I spent a few months experimenting with different approaches for writing simple, elegant and maintainable media queries with Sass. Each solution had something that I really liked, but I couldn't find one that covered everything I needed to do, so I ventured into creating my...

Incredible Demos

  • PHP Woot Checker &#8211; Tech, Wine, and Shirt Woot

    If you haven't heard of Woot.com, you've been living under a rock. For those who have been under the proverbial rock, here's the plot: Every day, Woot sells one product. Once the item is sold out, no more items are available for purchase. You don't know how many...

  • Pure CSS Slide Up and Slide Down

    If I can avoid using JavaScript for element animations, I'm incredibly happy and driven to do so.  They're more efficient, don't require a JavaScript framework to manage steps, and they're more elegant.  One effect that is difficult to nail down with pure CSS is sliding up...

Discussion

  1. Evan

    Interesting. I can defiantly see using this one.

    What would happen if I tried to use that pseudo selector on an element that is not a select? Do you think it would be a good idea to wrap it in an if statement? Also could we return the selected element with the MooTools element extensions already applied?

    if(this.get('tag') == 'select'){
         return $(this.selected);
    }
    
  2. @Evan: Per your comment:

    1. Good question, didn’t try that.
    2. Good idea.
    3. I don’t believe you need to do that.
  3. @Even: Actually, let me reconsider my response:

    There should be a check to make sure it’s a “select” element. I’ll add that and test when I get a free moment. Your “return $()” is wrong though. All that needs to be returned within the pseudos is a “true” or “false” value. Essentially, is the condition a match or no?

  4. @Evan: One more update. You want to make sure the tag is an “option” tag, not a “select” tag.

  5. Grammar Nazi

    Interesting. I can defiantly see using this one.

    The word is definitely… Why do so many people have trouble spelling this word?

  6. Evan

    @Grammar Nazi… I noticed the stupid spelling mistake right after I posted and could not go back to edit…

    @david Thanks for testing out my questions for me.

  7. really nice one, it look good

  8. MooTools has functionality built in to get selected elements:

    http://mootools.net/docs/Element/Element#Element:getSelected

  9. @atom: Yep, I guess I find “:selected” to be shorter and within the $$() functionality.

  10. This is one of the neatest tricks I’ve seen in a while. I can already think of two situations where I’d use this right away! Keep up the good work Mister Walsh.

    Oh, and when I read that someone would “defiantly” use this, I just figured they were being rebellious, audacious, insubordinate … mutinous. Using this technique with recalcitrant disobedience.

    “Definitely” is spelled right, but much less interesting.

  11. Ha, nice script, in my current style of programming I don’t use it, but defiantly will later on!

    Sorry Grammar, couldn’t resist :)

  12. If MooTools implement CSS3 for it’s selector the :checked could be used.

    While the :checked pseudo-class is dynamic in nature, and is altered by user action, since it can also be based on the presence of the semantic HTML4 selected and checked attributes, it applies to all media.

    See http://www.w3.org/TR/css3-selectors/#UIstates

  13. Yann

    Do you know your script doesn’t work on IE ?

  14. Luke Hoggett

    In response to Yann’s comment to have this pseudo selector and other play nice with IEs you might like to have a look at this Mootools Core ticket on Lighthouse

    from Valerio’s comment there the script would need to be something like (note haven’t tested)

    Selectors.Pseudo.selected = function(){
        return (this.selected && 'option' == Element.get(this, 'tag'));
    };
    
  15. Thunder Mountain

    For IE and FF support you can wrap it in a Try/Catch

    Selectors.Pseudo.selected = function(){
        var tag;
    
        try {
            tag = Element.get(this, 'tag');
        } 
        catch (ex) {
            tag = this.get('tag');
        }
    
         return (this.selected && ‘option’ == tag);
    );
    

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

Recently on David Walsh Blog

  • Access Mac Camera by Command Line

    With all of my recent command line tutorials, I've really gotten excited about the shell's simplicity and realized the true power of using the underlying technology of pretty UIs.  Since I work from home, I spend a lot of time on video calls, so when...

  • Open Files from Command Line on OS X

    I'm as much of a fan of application UIs as anyone else but I'm finding myself working more and more from the command line lately.  Much of that is becoming obsessed with media manipulation but I'm forcing myself to use less UIs so that I...

  • Get Stock Quotes From Command Line

    When I conned my way into my first professional programming gig, I didn't really think much about money -- just that I was getting my foot in the door.  But as my career has gone on, I've been more aware of money, investing, and retirement.  I've recently...

  • Geolocation API

    One interesting aspect of web development is geolocation; where is your user viewing your website from? You can base your language locale on that data or show certain products in your store based on the user's location. Let's examine how you can...

  • Create an Image Preview from a Video

    Visuals are everything when it comes to media.  When I'm trying to decide whether to watch a video on Netflix, it would be awesome to see a trailer of some kind, but alas that isn't available.  When I'm looking to download a video on my computer,...