Mar 15 2010

Meio.Autocomplete, Mootools Autocomplete plugin

Category: Ajax,Javascript,Mootoolsfabiomcosta @ 23:15

Meio.Autocomplete Docs and Demos

Yeah, we haven’t posted for a while, but it’s time to show you some great code I’ve been working on these days.

I’ve been searching for a good auto-complete plugin for a while. Found some good ones but none of them is perfect and I sometimes had to change their codes to get what I wanted on my projects. So I got tired and decided that I should do my own. My “perfect” one.

Basically I wanted an auto-complete plugin that would act as a select DOM element, which means, when I select a value on the auto-complete list the id of this option is setted somewhere (a hidden field for example) and I needed to have access to the “select” and “deselect” events, that would be fired when I select and deselect an option, respectively.

Meio.Autocomplete does all these simple tasks and more. It’s full of options and I made it in a way that it would be easy to set it up. I really recommend you to take a look at its documentation and see the demos to understand how it works. You can change the demos code too if you wish and run the resulting code, thanks to Mooshell.

I’m open to new ideas, bug fixes, new options etc… Feel free to comment and ask anything (help included) on the documentations page.

Meio.Autocomplete Docs and Demos


Aug 13 2009

New changed event

Category: Javascript,Mootoolsfabiomcosta @ 00:02

Have you ever had problems with the ‘change’ event? I did, in particular on text-inputs.

I’ll list the crazy behaviors i don’t like about it:

  • If you change the value of a text input and submit the actual form by pressing enter, on Opera the change event won’t fire!;
  • If you apply keydown, keypress or keyup and any of them returns false (this is used on meioMask and most of the plugins that filters the input from the user), the change event won’t fire!;
  • If you focused on a text input and some script you made changes the value from this input, when you blur it the change even’t won’t fire!;
  • On IE, if you choose one of the native auto-complete options that is shown when you focus without typing anything, change event won’t fire!

That’s why i created this new glossy ‘changed’ event, which is the change event but fixing all these problems i listed. It uses the power of the Mootools custom events to create this new event that can be used like any other event.

I’ve created a page to show it working.

/**
 * @author Fábio Miranda Costa <fabiomcosta [at] gmail [dot] com>
 * 09-07-2009
 * http://www.meiocodigo.com
 * Changed Event for Mootools 1.2.x
 */</p>

<p>(function(){</p>

<pre><code>var $ = document.id || $;
var STORAGE_VALUE = 'changed-event-value-storage';
var lastFocused = null;
var focusFunc = function(){
    lastFocused = this;
    this.store(STORAGE_VALUE, this.get('value'));
};
var submitFunc = function(e){
    if(check.call(lastFocused)){
        lastFocused.fireEvent('changed');
    }
};
var check = function(e){
    var storedValue = this.retrieve(STORAGE_VALUE);
    // this happens when you focus the input before adding the changed event on the input
    if(storedValue === null) return false;
    return this.value !== storedValue;
};

Element.Events.changed = {
    base: 'blur',
    onAdd: function(){
        var evts = this.retrieve('events');
        if(!(evts &amp;&amp; evts.focus &amp;&amp; evts.focus.keys.contains(focusFunc))){
            this.addEvent('focus', focusFunc);
            var formEl = $(this.form), fevts = formEl.retrieve('events');
            if(!(fevts &amp;&amp; fevts.submit &amp;&amp; fevts.submit.keys.contains(submitFunc))){
                formEl.addEvent('submit', submitFunc);
            }
        }
    },
    condition: function(e){
        e.type = 'changed';
        return check.call(this, e);
    },
    onRemove: function(){
        var evts = this.retrieve('events');
        if(!evts.changed.keys.length){
            this.removeEvent('focus', focusFunc);
            if(lastFocused == this) lastFocused = null;
            if(!submitInputs.length){
                $(this.form).removeEvent('submit', submitFunc);
            }
        }   
    }
};
</code></pre>

<p>})();

I’m sorry about the entities errors on the code, its this f…. s…. blog system that simply can’t do it right. If anybody know how to solve this, please let me know.

It won’t hurt if i remember that it should only be used on text inputs (it wont work as expected on radiobuttons and checkboxes) and you should apply the event before you focus the element (its kind of obvious but as i said, it won’t hurt).

Did i tell you that Mootools rocks? ;)