select选择框

kxapi - 实现模拟select选择框的基本功能

by calefy

HTML

<script src="http://s.kaixin001.com.cn/js/base/Haibei_Combo-000761409.js"></script>
<script src="http://s.kaixin001.com.cn/js/kxbase-0029d51b6.js"></script>
<script src="http://s.kaixin001.com.cn/js/apps/common/Select-38m232k3.js"></script>
<div class="box">
    <a href="#" class="select" id="year">
        <span class="input">年</span>
        <i class="icon"></i>
        <input type="hidden" name="year" />
    </a>
    <a href="#" class="select" id="month">
        <span class="input">月</span>
        <i class="icon"></i>
        <input type="hidden" name="month" />
    </a>
    <a href="#" class="select" id="day">
        <span class="input">日</span>
        <i class="icon"></i>
        <input type="hidden" name="day" />
    </a>
</div>

<br/>
<div>
    <p>* 每个Select元素是一个 a 标记,是为了保证通过Tab键得到焦点时,可以显示下拉框</p>
    <p>* 结构中有一个显示文本的span,和一个用来存储值的type="hidden" 的input,保证作为表单提交时方便操作</p>
    <p>* 想要让下拉框选中某个默认的值,只需要在list中将该项添加.hover即可</p>
    <p>* 只要需要的结构保持不变,其他类名都可以配置改变</p>
</div>

<!--年-->
<div class="list" data-type="year">
    <ul>
        <li>1980</li>
        <li>1981</li>
        <li>1982</li>
        <li>1983</li>
        <li>1984</li>
        <li>1985</li>
        <li class="hover">1986</li>
        <li>1987</li>
        <li>1988</li>
        <li>1989</li>
        <li>1990</li>
    </ul>
</div>

<!--月-->
<div class="list" data-type="month">
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
        <li>10</li>
        <li>11</li>
        <li>12</li>
    </ul>
</div>

<!--日-->
<div class="list" data-type="day">
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
        <li>10</li>
        <li>11</li>
        <li>12</li>
        <li>13</li>
        <li>14</li>
        <li>15</li>
        <li>16</li>
       ...

CSS

ul,li{padding:0;margin:0;}
.box{padding:25px;}

.select{display:inline-block;outline:none;position:relative;text-decoration:none;cursor:default;}
.select .input{display:block;border:1px solid #aaa;padding:5px;width:80px;}
.select .icon{position:absolute;top:12px;right:5px;cursor:pointer;border-width:5px 5px 0;border-color:#444 transparent;border-style:solid;}

.list{display:none;position:absolute;border:1px solid #999;width:90px;height:200px;overflow:auto;line-height:23px;background-color:#fff;}
.list li{border-bottom:1px solid #eee;cursor:pointer;padding-left:5px;}
.list li.hover{background-color:#eee;}

JavaScript

/**
 * 测验select选择框
 */
K.App('ASelectTest', ['jQuery', 'apps/common/Select']).define(function(require) {
    var $ = require('jQuery'),
        Select = require('apps/common/Select');

    return {
        'main': function() {
            var year, month, day;

            year = new Select({
                'trigger': '#year',
                'input': '#year input',
                'text': '#year .input',
                'listCon': 'div[data-type=year]',
                'listItem': 'div[data-type=year] li',
                'hoverClass': 'hover'
            });

            month = new Select({
                'trigger': '#month',
                'input': '#month input',
                'text': '#month .input',
                'listCon': 'div[data-type=month]',
                'listItem': 'div[data-type=month] li',
                'hoverClass': 'hover'
            });

            day = new Select({
                'trigger': '#day',
                'input': '#day input',
                'text': '#day .input',
                'listCon': 'div[data-type=day]',
                'listItem': 'div[data-type=day] li',
                'hoverClass': 'hover'
            });

            this.year = year;
            this.month = month;
            this.day = day;

            // 选中一个月份后,天数处理
            month.on(Select.Event.SelectedItem, $.proxy(this.afterSelectedMonth, this));

        },

        /**
         * 选中月份后更新对应的天数
         *   - 更新天数的下拉,会有31、30、29、28四种情况
         *   - 更新天数选项的显示值。如果上次选了31天,这次月份变为2,那么显示的31就要变成1
         */
        'afterSelectedMonth': function(selectedInfo) {
/*
            window.console && window.console.log(
                ['选中的月份dom: ', selectedInfo.item,
                 ' value: ', selectedInfo.value]
            );
            */

            var year = this.year,
                month = this.month,
                day = this.day,

                domDays = $('div[data-type=day] ul').html(''),

                m =...