zoukankan      html  css  js  c++  java
  • 实现浏览器遗漏的原件 jQuery.selectCheckbox

    工作中遇到了一个下拉需要实现checkbox的效果,如下图

    或许网上已经有实现了,但简单的功能自己实现就好了,

    结构

    <div class="form-control-wrap">
        <div class="form-item-inputcheckbox">
            
        </div>
    </div>

    样式,这里使用scss编写

    .form-item-inputcheckbox{
        .form-checkbox-label{
            margin-bottom: 4px;margin-right: 16px;
            input{
                vertical-align: top;margin-right: 4px;
            }
        }
        .form-item-input{
            -ms-text-overflow: ellipsis;
            text-overflow: ellipsis;
            white-space: nowrap;
            overflow: hidden;
        }
        .form-item-checkboxwrap{
            margin: 0;background: #fff;border:1px solid #66afe9;padding: 10px;
            max-height: 150px;overflow-y: auto;position: absolute;width: 100%;
            display: none;z-index:2;
        }
        .form-item-line {
            font-weight: normal;
            padding: 0 4px;
        }
    } 

    下面是脚本,比较少写jQuery的插件,写法可能不够地道,不足之处忘指出

    ~(function ($) {
        var __root;
        var checkItemTpl = '<label class="form-checkbox-label">'+
                "<input type='checkbox' value='${value}' text='${text}' ${check}>${text}"+
              '</label>';
    
        function template(str, data, regexp) {
            return str.replace(regexp || /${([^{}]*)}/g, function (str, p1) {
                return (data[p1]!==undefined&&data[p1]!==null&&data[p1].toString())||"";
            });
        }
        function rander() {
            __root.html('<div class="form-control form-item-input"></div><div class="form-item-checkboxwrap checkbox"></div>');
            var texts = '',valHtmls = [],datas = [];
            $.each(__data, function(index, val) {
                val.check= val.checked ?'checked':'';
                texts += template(checkItemTpl,val);
                if(val.checked){
                    valHtmls.push(val.text);
                    datas.push(val.value);
                }
            });
            __root.find('.form-item-checkboxwrap').html(texts);
            renderInput(__root.find('.form-item-input'),valHtmls,datas);
        }
        function renderInput(input,texts,datas) {
            input.html(texts.join(';')).attr('title',texts.join(';'))
            .val(datas.join(';')).data('value', datas).data('text', texts);
        }
        function ctrl() {
            var $selectWrap = __root.find('.form-item-checkboxwrap');
            __root.click(function(e) {
                $(this).find('.form-item-checkboxwrap').show();
                e.stopPropagation();
            });
            __root.find('input').click(function () {
                var __input = $(this).parents('.form-item-checkboxwrap').siblings('.form-item-input');
                var val = $(this).val(),
                    text = $(this).attr('text'),
                    datas = __input.data('value'),
                    texts = __input.data('text');
                if($(this)[0].checked){
                    datas.push(val);
                    texts.push(text);
                    
                }else{
                    var i = datas.indexOf(val);
                    datas.splice(i,1);
                    texts.splice(i,1);
                }
                renderInput(__input,texts,datas);
            });
            $('body').click(function() {
                $selectWrap.hide();
            });
        }
        $.fn.selectCheckbox = function(option){
            __root = $(this);
            __data = option.data;
            rander();
            ctrl();
        }
    })(jQuery)

    调用脚本

    var values = [{
                    checked: true,
                    text: "男",
                    value: "male"
                }, {
                    checked: true,
                    text: "女",
                    value: "female"
                }, {
                    checked: false,
                    text: "未知",
                    value: "unknown"
            }];
            $('.form-item-inputcheckbox').selectCheckbox({data:values});

    生成的效果:

    取出数据的时候已经选择的数据时候需要调用

    $('.form-item-input').data()

     

  • 相关阅读:
    socketpair + signal + select 的套路
    java 远程调用 RPC
    Java 序列化
    Java Socket 编程
    云计算 IaaS,SaaS,PaaS的区别?一个通俗易懂的吃货文章
    如何应对网站反爬虫策略?如何高效地爬大量数据?
    java NIO详解
    LigerUI LigerGrid getSelectedRows() 多选顺序 不是从上到下修改方法
    JSON风格指南
    Json 工具介绍 fastjson gson jackson
  • 原文地址:https://www.cnblogs.com/peace1/p/6116797.html
Copyright © 2011-2022 走看看