實作範例


HTML範例

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js"></script>
<script type="text/javascript" src="dynamicSelector.js"></script>
<select id="county" class="dynamicSelector" title="{'url':'dynamicSelector.php?ac=getCounty'}">
    <option value="N">彰化縣</option>
</select>
<select id="area" class="dynamicSelector" title="{'url':'dynamicSelector.php?ac=getArea','parent':'#county','varname':'countyCode'}">
    <option value="524">溪州鄉</option>
</select>
<select id="school" class="dynamicSelector" title="{url:'dynamicSelector.php?ac=getSchool',parent:'#area',varname:'areaCode'}">
    <option value="www.cges.chc.edu.tw">成功國民小學</option>
</select>

PHP範例

<?php
    
switch($_GET['ac']){
        case 
'getCounty':
            
$county = array(
                
'A' => '台北市',
                
'N' => '彰化縣'
            
);
            echo 
json_encode($county);
        break;
        case 
'getArea':
            
$area['A'] = array(
                
'103' =>'大同區',
                
'104' =>'中山區'
            
);
            
$area['N'] = array(
                
'523' => '埤頭鄉',
                
'524' => '溪州鄉'
            
);
            echo 
json_encode($area[$_GET['countyCode']]);
        break;
        case 
'getSchool':
            
$school['103'] = array(
                
'www.mlps.tp.edu.tw' =>'明倫國民小學',
                
'www.dlps.tp.edu.tw' =>'大龍國民小學',
                
'www.ylps.tp.edu.tw' =>'永樂國民小學'
            
);
            
$school['104'] = array(
                
'www.csps.tp.edu.tw' => '中山國民小學',
                
'www.tzes.tp.edu.tw' => '大直國民小學',
                
'www.yaes.tp.edu.tw' => '永安國民小學'
            
);
            
$school['523'] = array(
                
'www.shses.chc.edu.tw' => '合興國民小學' ,
                
'www.ches.chc.edu.tw' => '中和國民小學'
            
);
            
$school['524'] = array(
                
'www.cyps.chc.edu.tw' => '潮洋國民小學',
                
'www.cges.chc.edu.tw' => '成功國民小學'
            
);            
            echo 
json_encode($school[$_GET['areaCode']]);
        break;        
    }
?>

dynamicSelector.js檔案內容

$(document).ready(function(){
    //代替反斜線(避免HTML驗證器的警告)
    var slash = '/';
    //抓起需動態產生的選單
    var dynamicSelector = $('select[class="dynamicSelector"]');
    //針對每個動態選單預始化與事件設定
    $.each(dynamicSelector,function(){        
        //目前執行的選單
        var selector = $(this);
        //取得設定檔(定義於title屬性中)
        var config = eval('('+selector.attr('title')+')');
        //如果有父層選單,取得父層的預設值
        if(config.parent != null){
            //父選單物件
            var parentSeletor = $(config.parent);
            //父選單目前的值
            var parentValue = ($('option:selected',parentSeletor).attr('value'));
            //初始Ajax的URL網址,並加上變數
            iniUrl = config.url+'&'+config.varname+'='+parentValue;
            //進行遠端讀取選項
            $.getJSON(iniUrl,function(json){
                //該選單的預設值
                var defaultValue = ($('option:selected',selector).attr('value'));
                //用來存放動態產生的選項
                var opts = '';
                $.each(json,function(value,option){
                    if(value == defaultValue){
                        opts += '<option value="'+value+'" selected="selected">'+option+'<'+slash+'option>';
                    } else {
                        opts += '<option value="'+value+'">'+option+'<'+slash+'option>';
                    }                    
                });
                //註冊事件,當父層異動時,重新抓取父層值後更新自身選項
                parentSeletor.change(function(){
                    parentValue = $(this).val();
                    changeUrl = config.url+'&'+config.varname+'='+parentValue;
                    $.getJSON(changeUrl,function(json){
                        defaultValue = ($('option:selected',selector).attr('value'));
                        opts = '';
                        $.each(json,function(value,option){
                            if(value == defaultValue){
                                opts += '<option value="'+value+'" selected="selected">'+option+'<'+slash+'option>';
                            } else {
                                opts += '<option value="'+value+'">'+option+'<'+slash+'option>';
                            }                    
                        });
                        selector.html(opts);
                        $(selector).trigger('change');
                    });
                });
                //刷新選單內的選項
                selector.html(opts);
            });
        } else {
            $.getJSON(config.url,function(json){
                //取得選單中預設的選項
                var defaultValue = ($('option:selected',selector).attr('value'));               
                var opts = '';
                $.each(json,function(value,option){
                    if(value == defaultValue){
                        opts += '<option value="'+value+'" selected="selected">'+option+'</option>';
                    } else {
                        opts += '<option value="'+value+'">'+option+'</option>';
                    }                    
                });
                selector.html(opts);
            });
        }        
    });
});