Class SelectSelector

セレクトメニューにオプションエリアを連動させる

by Tenderfeel

HTML

<form>
    <table>
        <tr>
            <th>Menu</th>
            <td>
            <select name="reservemenu" id="reserve-menu">
                <optgroup label="フルーツ" id="menu-fruit">
                    <option value="りんご">りんご</option>
                    <option value="みかん">みかん</option>
                    <option value="バナナ">バナナ</option>
                </optgroup>
                <optgroup label="魚" id="menu-fish">
                    <option value="サンマ">サンマ</option>
                    <option value="イワシ">イワシ</option>
                    <option value="アジ">アジ</option>
                </optgroup>
                <optgroup label="肉" id="menu-meat">
                    <option value="豚肉">豚肉</option>
                    <option value="牛肉">牛肉</option>
                    <option value="鶏肉">鶏肉</option>
                </optgroup>
            </select>
            </td>
        </tr>
        <tr class="options hide">
            <th>Option</th>
            <td>
                <div id="opt-fruit" class="option hide">
                    <label><input type="checkbox" value="有機栽培">
                        有機栽培</label><br>
                    <label>サイズ:<select name="option[]">
                        <option value="Size S">S</option>
                        <option value="Size M">M</option>
                        <option value="Size L">L</option>
                        </select></label>
                </div>
                <div id="opt-fish" class="option hide">
                    <label><input type="checkbox" value="鮮魚">
                        鮮魚</label><br>
                    <label>サイズ:<select name="option[]">
                        <option value="Size S">S</option>
                        <option value="Size M">M</option>
                        <option value="Size L">L</option>
                        </select></label>
                </div>
                <div id="opt-meat" class="option hide">
                    <label><input type="text"...

CSS

table {
    border-collapse:collapse;
}
table, th, td {
    border:solid 1px #efefef;
}
th {
    background-color:#f6f6f6;
    padding:0.5em;
}
td {
    padding:0.5em;
    white-space:nowrap;
}

.hide {
    display:none;
}

JavaScript

(function($) {
this.SelectSelector = new Class({
    Implements: [Options],
    
    options: {
        selectorIdPrefix:'menu-',
        optionIdPrefix:'opt-',
        optionParentClass:'options',
        optionWrapClass:'option'
    },
    
    initialize: function(element, options) {
        this.setOptions(options);
        this.element = $(element);
        
        this.attachEvent();
    },
    
    attachEvent: function() {
        var self = this;
        var options = this.options;
        this.element.addEvent('change', function(){
            var p = this.getSelected().getParent('[id^='+options.selectorIdPrefix+']').shift();
            var opt = $(options.optionIdPrefix+ p.id.replace(options.selectorIdPrefix,''));
            self.hide($$('.'+options.optionParentClass));
        
            if(opt){
                $$('.'+options.optionParentClass).removeClass('hide');
                opt.removeClass('hide');
            }
        });
        
    },
    hide:function(arr){
        var options = this.options;
        var self = this;
            
        arr.each(function(el){
            if($type(el)==='element'){
                el.addClass('hide');
            }
            var childs = el.getElements('.'+options.optionWrapClass);
            if(childs) {self.hide(childs);}
        });
    }
    
});
})(document.id);

window.addEvent('domready', function(){
    new SelectSelector($('reserve-menu'));
});