|
|
/**
* A simple solution to the “other”
* problem with select boxes.
*
* @author John-David Dalton
* @link http://ajaxian.com/archives/a-simple-solution-to-the-other-problem-with-select-boxes#comments
*/
// Attempt 1) execute code when dom is loaded
document.observe('dom:loaded', function() {
$$('select.leader').invoke('change', function() {
if ($F(this) === 'other') {
this.next().writeAttribute('name', this.readAttribute('name')).show()
} else this.next().removeAttribute('name').hide();
});
});
// Attempt 2) OR if you include effects.js
// ...
$$('select.leader').invoke('change', function() {
var options = { duration:0.5 };
if ($F(this) === 'other') {
this.next().writeAttribute('name', this.readAttribute('name')).appear(options)
} else this.next().removeAttribute('name').fade(options);
});
// ...
// Attempt 3) OR if you want to call the handler after creating the observer
// ...
function onChange() {
if ($F(this) === 'other') {
this.next().writeAttribute('name', this.readAttribute('name')).show()
} else this.next().removeAttribute('name').hide();
}
$$('select.leader').each(function(element) {
element.observe('change', onChange);
onChange.bind(element)();
});
// ...
// Attempt 4) OR adding some sugar
Element.addMethods({
fire: Event.fire.wrap(function(proceed, element, eventName, memo) {
element = $(element);
var w, event, eventID;
$w(eventName)._each(function(name) {
// use original "fire" if it's a custom:event
if (name.include(':'))
return proceed(element, name, memo);
// handle native events
eventID = (element._prototypeEventID || [null])[0];
if (!eventID || !(w = Event.cache[eventID][name])) return false;
// poor man's event object
event = Event.extend({ });
event.eventName = name;
event.memo = memo || { };
// execute event wrappers
w._each(function(wrapper) { wrapper(event) });
});
return element;
})
});
document.observe('dom:loaded', function() {
$$('select.leader').invoke('change', function() {
if ($F(this) === 'other') {
this.next().writeAttribute('name', this.readAttribute('name')).show()
} else this.next().removeAttribute('name').hide();
}).invoke('fire', 'change');
});
|