weui.js将select变为weui.picker显示

本文介绍了一种在WeUI中将Select控件转换为Picker组件的方法,通过自定义JavaScript插件实现,允许用户在移动端界面中使用更友好的Picker选择器替代传统的下拉列表。

在weui的展示界面,有一个挺不错的picker模拟select的演示,但是我读了一遍weui.js的文档,却发现没有将select转为picker的这一过程封装,所以只好造了一个轮子,同时也上传到了github:weui.js-select2Picker

(() => {
    if (!weui || !$)
        return;
    weui.select2Picker = {
        init: () => {
            weui.select2Picker.initSelectChange();
            weui.select2Picker.initPcikerClick();
        },
        // 给select控件注册事件,改变时修改显示的值
        initSelectChange: () => {
            const pickerDoms = $('[pickerfrom]');
            $.each(pickerDoms, (i, dom) => {
                const target = $(dom).attr('pickerfrom');
                $('body').on('change', target, (e) => {
                    const $this = $(e.target);
                    if ($this.val()) {
                        weui.select2Picker.setValue($(`[pickerfrom="${target}"]`), $this.find(':checked').text());
                    }
                });
            });
        },
        // 给显示控件注册点击事件,点击时生成picker的options,如果控件存在pickerdisabled类,则停止工作
        initPcikerClick: () => {
            $('[pickerfrom]').on('click', (e) => {
                if ($(e.target).hasClass('pickerdisabled')) {
                    return;
                }
                const dom = $(e.target).attr('pickerfrom');
                let values = weui.select2Picker.initPickerOptions(dom);
                values = weui.select2Picker.uniqueOptions(values);
                weui.select2Picker.showPicker(dom, values);
            });
        },
        // 显示picker
        showPicker: (dom, items, options) => {
            weui.picker(items, $.extend({
                id: new Date().valueOf(),
                defaultValue: weui.select2Picker.getSelectValue(dom),
                onConfirm: function (result) {
                    const val = result[result.length - 1].value;
                    weui.select2Picker.setValue(dom, val);
                }
            }, options));
        },
        // picker的items去重
        uniqueOptions: values => {
            const newArr = [];
            values.forEach(x => {
                const exists = newArr.find(y => { return y.value == x.value });
                if (exists) {
                    if (x.children && x.children.length > 0) {
                        if (!exists.children) {
                            exists.children = [];
                        }
                        x.children.forEach(child => {
                            exists.children.push(child);
                        });
                    }
                } else {
                    newArr.push(x);
                }
            });
            return newArr;
        },
        // 创建pickeritems,如果存在optgroup则生成两级item
        initPickerOptions: dom => {
            const $select = $(dom);
            let pickerOptions = [];
            if ($select.find('optgroup').length > 0) {
                const $optgroup = $select.find('optgroup');
                $.each($optgroup, (i, $group) => {
                    const $option = $($group).find('option:first');
                    if ($option.attr('label')) {
                        pickerOptions.push({
                            value: $($group).attr('label'),
                            label: $($group).attr('label'),
                            disabled: $($group).prop('disabled'),
                            children: weui.select2Picker.option2Picker($group)
                        });
                    }
                });
            } else {
                pickerOptions = weui.select2Picker.option2Picker($select);
            }
            return pickerOptions;
        },
        // 将option生成为item,如果有disabled则设置对应属性
        option2Picker: parent => {
            const $option = $(parent).find('option');
            const hadArr = [];
            $.each($option, (i, $opt) => {
                if ($($opt).val()) {
                    hadArr.push({
                        value: $($opt).val(),
                        label: $($opt).text(),
                        disabled: $($opt).prop('disabled')
                    });
                }
            });
            return hadArr;
        },
        // 获取select当前的值,用作picker的默认值
        getSelectValue: dom => {
            const $this = $(dom);
            const val = $this.val();
            const choose = [];
            if (!val) {
                return choose;
            }
            if ($this.find(':checked').parent().attr('label')) {
                choose.push($this.find(':checked').parent().attr('label'));
            }
            choose.push(val);
            return choose;
        },
        // 给select赋值并且触发change事件
        setValue: (target, val) => {
            const $dom = $(target);
            if ($dom.is('select') || $dom.is('input')) {
                $dom.val(val);
            } else {
                $dom.text(val);
            }
            $dom.trigger("change");
        }
    }
})();

在需要显示文字的控件部分配置pcikerfrom指定select,然后直接调用weui.select2pciker.init()方法即可。

<think>我们使用jQuery WeUI来实现一个单选选择器,并将选择的结果显示在input输入框中。 步骤: 1. 引入必要的jQuery WeUI的CSS和JS文件。 2. 创建一个input输入框,用于显示选择结果和触发选择器。 3. 使用jQuery WeUIpicker组件初始化选择器,并设置数据源(单列数据)。 4.picker的onChange事件中,可以实时获取选择的值(可选)。 5.picker的onConfirm事件中,将选中的值设置到input框中,并隐藏picker。 注意:input需要设置为只读(readonly),以防止用户直接输入。 参考引用[2]和引用[3]中的思路,我们可以这样实现: 示例代码:</think># WeUI Picker选择器与输入框联动实现 下面我将展示如何使用HTML和WeUI框架实现Picker选择器,并将选中的结果实时显示在输入框中。 ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>WeUI Picker选择器与输入框联动</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/weui@2.5.17/dist/style/weui.min.css"> <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/weui@2.5.17/dist/weui.min.js"></script> <style> body { background-color: #f8f8f8; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; padding: 15px; max-width: 600px; margin: 0 auto; } .page-title { text-align: center; font-size: 22px; margin: 20px 0 30px; color: #1aad19; font-weight: 500; } .container { background-color: #fff; border-radius: 12px; overflow: hidden; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); } .weui-cells { margin-top: 0; } .result-container { padding: 15px; background-color: #f0f7ff; border-radius: 8px; margin: 20px 15px; } .result-title { font-size: 16px; color: #1aad19; margin-bottom: 10px; } .custom-btn { margin: 30px 15px; border-radius: 8px; background: linear-gradient(to right, #1aad19, #09bb07); color: white; font-size: 18px; height: 48px; line-height: 48px; text-align: center; box-shadow: 0 4px 10px rgba(26, 173, 25, 0.3); } .custom-btn:active { opacity: 0.9; transform: translateY(2px); } .footer { text-align: center; margin-top: 30px; color: #999; font-size: 14px; } .weui-cell__bd input { color: #1aad19; font-weight: 500; } .highlight { animation: highlight 1s ease; } @keyframes highlight { 0% { background-color: #fff; } 50% { background-color: #e8f5e9; } 100% { background-color: #fff; } } </style> </head> <body> <h1 class="page-title">WeUI Picker选择器应用</h1> <div class="container"> <!-- 城市选择器 --> <div class="weui-cells__title">选择城市</div> <div class="weui-cells"> <div class="weui-cell weui-cell_select"> <div class="weui-cell__bd"> <input class="weui-input" id="cityInput" type="text" placeholder="请选择城市" readonly> </div> </div> </div> <!-- 水果选择器 --> <div class="weui-cells__title">选择水果</div> <div class="weui-cells"> <div class="weui-cell weui-cell_select"> <div class="weui-cell__bd"> <input class="weui-input" id="fruitInput" type="text" placeholder="请选择水果" readonly> </div> </div> </div> <!-- 时间选择器 --> <div class="weui-cells__title">选择时间</div> <div class="weui-cells"> <div class="weui-cell weui-cell_select"> <div class="weui-cell__bd"> <input class="weui-input" id="timeInput" type="text" placeholder="请选择时间" readonly> </div> </div> </div> <!-- 结果显示区域 --> <div class="result-container"> <div class="result-title">当前选择结果</div> <div class="weui-cells"> <div class="weui-cell"> <div class="weui-cell__bd">城市:</div> <div class="weui-cell__ft" id="cityResult">未选择</div> </div> <div class="weui-cell"> <div class="weui-cell__bd">水果:</div> <div class="weui-cell__ft" id="fruitResult">未选择</div> </div> <div class="weui-cell"> <div class="weui-cell__bd">时间:</div> <div class="weui-cell__ft" id="timeResult">未选择</div> </div> </div> </div> </div> <div class="custom-btn" id="resetBtn">重置所有选择</div> <div class="footer"> WeUI Picker选择器示例 © 2023 </div> <script> $(document).ready(function() { // 城市数据 const cities = [ '北京', '上海', '广州', '深圳', '杭州', '南京', '成都', '重庆', '武汉', '西安', '苏州', '天津' ]; // 水果数据 const fruits = [ '苹果', '香蕉', '橙子', '葡萄', '西瓜', '芒果', '草莓', '菠萝', '桃子', '梨', '樱桃', '猕猴桃' ]; // 时间数据 const times = [ '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00' ]; // 初始化城市选择器 $('#cityInput').picker({ title: '请选择城市', cols: [{ textAlign: 'center', values: cities }], onChange: function(p, v) { if (v[0]) { $('#cityResult').text(v[0]).addClass('highlight'); setTimeout(() => $('#cityResult').removeClass('highlight'), 1000); } }, onConfirm: function(value) { $('#cityInput').val(value[0]); $('#cityResult').text(value[0]); } }); // 初始化水果选择器 $('#fruitInput').picker({ title: '请选择水果', cols: [{ textAlign: 'center', values: fruits }], onChange: function(p, v) { if (v[0]) { $('#fruitResult').text(v[0]).addClass('highlight'); setTimeout(() => $('#fruitResult').removeClass('highlight'), 1000); } }, onConfirm: function(value) { $('#fruitInput').val(value[0]); $('#fruitResult').text(value[0]); } }); // 初始化时间选择器 $('#timeInput').picker({ title: '请选择时间', cols: [{ textAlign: 'center', values: times }], onChange: function(p, v) { if (v[0]) { $('#timeResult').text(v[0]).addClass('highlight'); setTimeout(() => $('#timeResult').removeClass('highlight'), 1000); } }, onConfirm: function(value) { $('#timeInput').val(value[0]); $('#timeResult').text(value[0]); } }); // 重置按钮 $('#resetBtn').click(function() { $('#cityInput').val(''); $('#fruitInput').val(''); $('#timeInput').val(''); $('#cityResult').text('未选择'); $('#fruitResult').text('未选择'); $('#timeResult').text('未选择'); // 添加动画效果 $(this).addClass('highlight'); setTimeout(() => $(this).removeClass('highlight'), 1000); }); // 输入框点击事件 $('.weui-input').on('click', function() { $(this).addClass('highlight'); setTimeout(() => $(this).removeClass('highlight'), 1000); }); }); </script> </body> </html> ``` ## 实现原理说明 这个示例展示了如何将WeUI Picker选择器的选中结果显示在输入框中: 1. **创建只读输入框**:每个选择器对应一个只读输入框,用于显示最终选择结果 2. **初始化Picker组件**:使用`$.picker()`方法初始化选择器 3. **设置数据源**:通过`values`参数传递选择项数据 4. **事件处理**: - `onChange`:实时获取当前选择的值(用于预览) - `onConfirm`:当用户点击确定时,将选中的值设置到输入框中 5. **结果联动**:同时更新结果显示区域的内容 ## 关键代码解析 ```javascript // 初始化选择器 $('#cityInput').picker({ title: '请选择城市', cols: [{ textAlign: 'center', values: cities // 数据源 }], onConfirm: function(value) { // 将选中的值设置到输入框 $('#cityInput').val(value[0]); } }); ``` ## 功能特点 - 三种不同类型的Picker选择器(城市、水果、时间) - 选择结果实时显示在输入框和结果区域 - 选中时有视觉反馈效果 - 支持一键重置所有选择 - 完全响应式设计,适配移动设备 您可以直接复制上面的代码到HTML文件中运行,或根据实际需求修改数据源和样式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值