基于mui.popover的支持多选的弹出列表组件改造以及mui.prompt添加自定义内容

Posted 金刀3691

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于mui.popover的支持多选的弹出列表组件改造以及mui.prompt添加自定义内容相关的知识,希望对你有一定的参考价值。

在开发过程中总能遇到一些似曾相识有新鲜的玩意儿,此次要介绍的内容是在开发移动app过程中基于mui的popover进行改造的一个支持多选操作的底部弹出列表组件,以及如何往mui的prompt弹出输入式对话框中添加自定义的 input或textarea 内容,js操作,话不多说,具体代码如下:

javascript

var customPopverData = [
            {\'id\': \'id1\', \'name\': \'测试标题1\', \'size\': 12},
            {\'id\': \'id2\', \'name\': \'测试2\', \'size\': 13},
            {\'id\': \'id3\', \'name\': \'标题3\', \'size\': 8},
            {\'id\': \'id5\', \'name\': \'标题5\', \'size\': 3},
            {\'id\': \'id6\', \'name\': \'测试6\', \'size\': 1},
            {\'id\': \'id7\', \'name\': \'测试7\', \'size\': 0},
            {\'id\': \'id8\', \'name\': \'测试8\', \'size\': 2},
            {\'id\': \'id9\', \'name\': \'标题9\', \'size\': 6},
        ]
        
        mui.init()
        
        (function(doc) {
            var favoriteDiv = doc.createElement(\'div\');
            favoriteDiv.setAttribute(\'id\', \'favorites\');
            favoriteDiv.setAttribute(\'class\', \'mui-popover mui-popover-action custom-popover favorites\');
            favoriteDiv.innerhtml = \'<ul class="mui-table-view table-view-top">\\
                                        <li class="mui-table-view-cell center">\\
                                            <a href="#favorites" class="mui-icon mui-icon-closeempty"></a>\\
                                            <span class="title">选择项</span>\\
                                        </li>\\
                                        <li class="mui-table-view-cell">\\
                                            <a id="createF" href="#favorites" style="color: #0091FF;">+ 新建项</a>\\
                                        </li>\\
                                    </ul>\\
                                    <ul class="mui-table-view table-view-middle">\\
                                        <li class="mui-scroll-wrapper">\\
                                            <div class="mui-scroll"><ul class="mui-table-view"></ul></div>\\
                                        </li>\\
                                    </ul>\';
            // 此组件中间列表区域原结构是 <ul class="mui-table-view table-view-middle"></ul> 在安卓机中会出现无法滚动的现象
            // 为解决无法滚动 特添加 mui-scroll-wrapper  mui-scroll 结构 并使用mui(\'.mui-scroll-wrapper\').scroll() 进行初始化
            doc.body.appendChild(favoriteDiv);
            mui(\'.mui-scroll-wrapper\').scroll({
                bounce: true,
                indicators: true,
                deceleration: 0.0006
            });
            
            var promptExt = \'<textarea class="favorite-tips" rows="3" \\
                                style="font-size: 14px; width: 100%; padding: 5px; margin: 10px 0 -10px 0; border-radius: 0;" \\
                                placeholder="请输入收藏夹说明"></textarea>\'
            
            // 初始化组件列表
            initPopover();
            
            // 新建按钮点击事件监听
            doc.getElementById(\'createF\').addEventListener(\'tap\', function() {
                mui.prompt(\'新建项\', \'请输入名称\', \' \', [\'取消\', \'确认\'], function(e) {
                    // e.index为propmpt的按钮数组 [\'取消\', \'确认\'] 的索引值 e.index==0:取消按钮  e.index==1:确认按钮
                    if (e.index == 1) {
                        // 关于trim方法可参考博客   js去空 去除空格
                        var name = trim(doc.querySelector(\'.mui-popup-input input\').value)
                        var tips = trim(doc.querySelector(\'.mui-popup-input textarea.favorite-tips\').value)
                        if (!name || name.length < 2 || name.length > 10) {
                            mui.toast(\'名称 2~10 个字符\')
                            doc.querySelector(\'.mui-popup-input input\').value = !name ? \'\' : name;
                            return false;
                        }
                        if (tips > 200) {
                            mui.toast(\'收藏夹说明200个字符内\')
                            return false;
                        }
                        
                        // 这里可以执行自己的ajax请求进行数据保存操作
                        // 执行ajax后 重新渲染初始化mui.popover底部弹出组件
                        initPopover();
                        
                        mui.showLoading() // 自定义 mui loading 可参考博客 mui扩展插件mui.showLoading加载框
                    }
                },\'div\')
                // 一定要在执行mui.prompt方法后在执行一下方法  往prompt中添加自定义的 input或textarea 内容
                var popupInput = doc.querySelector(\'.mui-popup\').querySelector(\'.mui-popup-input\')
                popupInput.innerHTML = popupInput.innerHTML + promptExt
            }, false);
            
            // popover列表组件关闭按钮监听
            doc.querySelector(\'.mui-icon.mui-icon-closeempty\').addEventListener(\'tap\', function() {
                // dosomething
            }, false);
            
            // 初始化或更新popover列表组件内容
            function initPopover() {
                var html = \'\';
                // alert(\'init favorite popup -> init popup -> \')
                // 获取当前情况下的收藏夹列表进行初始化操作
                for (var i in customPopverData) {
                    var checked = customPopverData[i].include ? \'checked\' : \'\'; 
                    html += \'<li class="mui-table-view-cell">\\
                        <div class="mui-input-row mui-checkbox">\\
                          <label>\\
                              <div class="title">\' + customPopverData[i].name + \'</div>\\
                              <div class="tips"><span class="num">\' + customPopverData[i].size + \'</span>个内容</div>\\
                          </label>\\
                          <input name="favoriteCategory" value="\' + customPopverData[i].id + \'" \\
                          type="checkbox" \' + checked + \'>\\
                        </div>\\
                    </li>\'
                }
                // type="checkbox" \' + checked + \' onchange="favoriteChange(this)">\\
                html += \'\'
                // html += \'<li class="mui-table-view-cell" style="height: 60px;"></li>\'
                doc.querySelector(\'.mui-table-view.table-view-middle .mui-table-view\').innerHTML = html
                listnerFavoriteChange()
            }
            
            // 监听组件中的复选框状态 
            function listnerFavoriteChange() {
                var checkboxs = doc.querySelectorAll(\'input[name="favoriteCategory"]\')
                // alert(\'len -> \' + checkboxs.length)
                mui.each(checkboxs, function(index, ele) {
                    ele.addEventListener(\'change\', function() {
                        // alert(\'checked -> \' + ele.checked + \'\\nvalue -> \' + ele.value)
                        var num = ele.parentNode.querySelector(\'span.num\').innerHTML
                        var id = ele.value
                        if (ele.checked) { // 复选框选中
                            alert(\'checked -> \' + ele.checked + \'\\nnum -> \' + num + \'\\nid -> \' + id)
                        } else { // 复选框取消选中
                            alert(\'checked -> \' + ele.checked + \'\\nnum -> \' + num + \'\\nid -> \' + id)
                        }
                    }, false)
                })
            }
        }(document));

创建  custom.popover.css 文件写入一下内容:

.mui-popover.custom-popover {
    position: fixed;
}
.mui-popover.custom-popover,
.mui-popover.custom-popover * {
    font-size: 16px;
}
.mui-popover.mui-popover-action.custom-popover .mui-table-view {
    margin: 0;
    text-align: left;
    border-radius: 0;
}
.mui-popover.custom-popover .mui-table-view.table-view-middle {
    height: 200px;
}
.mui-popover.custom-popover .mui-table-view:after {
    height: 1px;
}
.mui-popover.custom-popover .mui-table-view.table-view-middle:after {
    height: 0;
}
.mui-popover.custom-popover .mui-table-view.table-view-bottom.fixed-btn-box {
    background: #035495;
    border-radius: 6px;
    position: fixed;
    z-index: 999;
    color: white;
    bottom: 6px;
    width: 90%;
    left: 5%;
}
.mui-popover.custom-popover .mui-table-view.table-view-bottom.fixed-btn-box:after {
    height: 0;
}
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell {
    padding: 11px 25px;
}
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell.center {
    text-align: center;
}
.mui-popover.custom-popover .mui-table-view.table-view-top .mui-table-view-cell {
    padding: 11px 20px;
}
.mui-popover.custom-popover .mui-table-view.table-view-bottom.fixed-btn-box .mui-table-view-cell {
    padding: 0;
    border-radius: 5px;
}
.mui-popover .mui-table-view.table-view-top li.mui-table-view-cell a.mui-icon-closeempty {
    top: 18px;
    left: 20px;
    padding: 0;
    color: #999999;
    display: inline;
    font-size: 30px;
    font-weight: bold;
    position: absolute;
    border-bottom: none;
}
.mui-popover .mui-table-view.table-view-top li.mui-table-view-cell span.title {
    color: #3a3a3a;
    font-weight: 600;
}
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell:last-child:after {
    height: 0;
}
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell .mui-input-row.mui-checkbox label,
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell .mui-input-row.mui-radio label {
    text-align: left;
    padding: 0 30px 0 0;
}
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell .mui-input-row.mui-checkbox label>.title,
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell .mui-input-row.mui-radio label>.title {
    line-height: 25px;
    font-weight: 600;
    color: #000000;
    height: 25px;
}
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell .mui-input-row.mui-checkbox label>.tips>span.num,
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell .mui-input-row.mui-radio label>.tips>span.num,
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell .mui-input-row.mui-checkbox label>.tips,
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell .mui-input-row.mui-radio label>.tips {
    line-height: 20px;
    font-size: 12px;
    color: #999999;
    height: 20px;
}
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell .mui-input-row.mui-checkbox input[type=checkbox],
.mui-popover.custom-popover .mui-table-view .mui-table-view-cell .mui-input-row.mui-radio input[type=radio] {
    top: 5;
    right: 0;
}
.mui-popover.custom-popover .mui-table-view.table-view-bottom.fixed-btn-box .mui-table-view-cell .btn {
    margin: 0;
    height: 50px;
    line-height: 50px;
    border-radius: 5px;
}
a.research-laws-info-operation-frame2-font.collect-btn {
    width: 100%;
    height: 100%;
    margin: 9px 0;
    line-height: 1;
}
a.research-laws-info-operation-frame2-font.collect-btn>span.mui-icon {
    top: -1px;
    font-size: 18px;
    position: relative;
    margin-right: 10px;
}

html:

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <link href="../css/mui.min.css" rel="stylesheet" />
        <link href="../css/custom.popover.css" rel="stylesheet" />
    </head>

    <body>
        <header class="mui-bar mui-bar-nav" style="background: #ffffff; box-shadow: none;">
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
            <h1 class="mui-title">基于mui.popover的底部弹出列表组件和mui.prompt</h1>
        </header>
        <div class="mui-content">
            <a href="#favorites" class="mui-btn mui-btn-outlined" style="margin: 30px 30%;">mui.custom.popover</a>
        </div>
    </body>
    <script src="../js/mui.min.js"></script>
</html>

效果展示:

              

 

 

 

以此做个记录,

如有不足之处还望多多留言指教!

以上是关于基于mui.popover的支持多选的弹出列表组件改造以及mui.prompt添加自定义内容的主要内容,如果未能解决你的问题,请参考以下文章

我想创建一个可滚动的弹出列表窗口,但我不知道从哪里开始。我用啥来做这个?

antd Form表单中的select组件在多选的模式下增加全选

多选的时间插件daterangepicker

Android:支持多选的本地相册

基于Kalendaer的日期多选

iview tree 组件如何初始化选中一个,单选不是多选的