表单

### 基础表单模板 ```html <form class="layui-form" id="form"> <div class="layboxn"> <h3 class="laytitle p10 f14">表单标题</h3> <div class="layui-row pb10 pr15 bline"> <!-- 一行 --> <div class="layui-col-xs12 layui-col-sm6 mt10 layui-form-item"> <label class="layui-form-label labeltxt">名称:</label> <div class="layui-input-block"> <input type="text" name="title" required lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input"> </div> </div> </div> <div class="layui-form-item pt10 pb10 myButton"> <button class="layui-btn ml15" lay-submit lay-filter="saveRule" > 提交 </button> </div> </div> </form> ``` ![image.png](https://cos.easydoc.net/27100029/files/k9wj7y9s.png) ### 表单提交 可以使用layui方法, 也可以使用jq, 但为了统一还是使用 layui 方法好 ```html <button class="layui-btn" lay-submit lay-filter="save">提交</button> ``` ```javascript form.on("submit(save)", function (data) { var submitData = {} // 需要提交的数据 submitData.id = id // 示例, 提交id onion.ajax.post(url, submitData, function (res) { if (res.code == onion.networkState.SUCC) { // 成功操作 } else { // 失败操作 } }); return false // 不能漏 }) ``` ### 表单数据回显 ```javascript function render() { onion.ajax.post(url, submitData, function (res) { if (res.code == onion.networkState.SUCC) { var data = res.data id = data.id // 简单的回显, 与表单的name一致 form.val("form", { id: id }) editror.html(data.content) // 假设有富文本, editror与富文本最初声明一致 } else {} }) } ``` ### 时间选择 ```html <input class="layui-input" name="startDate" id="start" autocomplete="off" placeholder="请输入开始时间" /> ``` ![image.png](https://cos.easydoc.net/27100029/files/k9wj8yz4.png) ```javascript var layDate = onion.laydate; layDate.render({ elem: "#start", type: "datetime", range: false, trigger: 'click' }); ``` [详细参数见](https://www.layui.com/doc/modules/laydate.html) ### 表单元素监听 select, checkbox, switch, radio, submit 需要监听操作 ```html <select name="name" lay-filter="select"> <!-- lay-filter, 其他元素同 --> <option value="">请选择</option> </select> ``` ```javascript form.on('select(select)', function (data) { console.log(data.value) }) ``` ### 只能填写数字 ```javascript lay-verify="required|number" ``` ### 表单中的图片上传 #### HTML与CSS模板 ```html <!--form表单内--> <div class="layboxn mt10"> <h3 class="laytitle p10 f14">证件图片</h3> <div class="upload p10 bline"> <button type="button" class="layui-btn" id="uploadImg"> <i class="layui-icon">&#xe67c;</i>上传图片 </button> </div> <div class="ggImglist"> <ul class="layui-row" id="previewList"></ul> </div> </div> ``` ```css .ggImglist li{width:150px;float:left;border-bottom:dotted #dfdfdf 1px;border-right:dotted #dfdfdf 1px;} .ggImglist li .imgdel{top:0;right:0;background-color:#f2f2f2;width:20px;height:20px;display:block;font-size:16px;line-height:20px;text-align: center; } .ggImglist li .layui-input{width:80px;} .ggImglist li .imgdel:hover{cursor:pointer;color:#fff;background-color:rgb(0, 150, 136)} ``` ![image.png](https://cos.easydoc.net/27100029/files/k9wjaqso.png) #### 触发上传图片按钮 ```javascript onion.upload({elem: '#uploadImg', url: '/common/image/upload', data: {type: 16}}, function (res) { var res = res[0]; if (res.code == onion.networkState.SUCC) { $('#previewList').append(renderImg(res.data)); delImg(); form.render(); } else { onion.layer.tipMsg(res.msg); } }) ``` #### 渲染图片展示列表 ```javascript function renderImg(data) { var random = onion.random(8); // 数据回显 if (data.warehouseId) { var temp = '<li class="flexbox je-align-center pt10 pb10" id="' + data.warehouseId + '">' + ' <div class="ml10 jepor">' + ' <i class="layui-icon imgdel jepoa" >&#x1006;</i>' + ' <img data-lePicUrl="' + data.idPicUrl + '" src="' + onion.suffx + (data.idPicUrl) + '" width="100" height="100" alt="">' + ' </div>' + ' </li>'; } else { // 新增 var temp = '<li class="flexbox je-align-center pt10 pb10" id="' + data.warehouseId + '">' + ' <div class="ml10 jepor">' + ' <i class="layui-icon imgdel jepoa" >&#x1006;</i>' + ' <img data-lePicUrl="' + data.url + '" src="' + onion.suffx + (data.url || data.idPicUrl) + '" width="100" height="100" alt="">' + ' </div>' + ' </li>'; } return temp; } ``` #### 获取图片数据, 以实际接口内容为准 ```javascript getProductDetail(id); function getProductDetail(id) { onion.ajax.post('/goods/warehouse/uploadInfo?id='+id, function (res) { if (res.code == onion.networkState.SUCC) { var data = res.data; renderSpecal(data); } } }) } ``` #### 渲染上传图片 ```javascript function renderSpecal(data) { var idPicUrls = data; for (var i = 0; i < idPicUrls.length; i++) { $('#previewList').append(renderImg(idPicUrls[i])); delImg(); } } ``` #### 图片删除操作 ```javascript function delImg() { $('#previewList .imgdel').on('click', function () { $(this).parent().parent().remove(); }) } ``` #### 通过表单, 上传图片内容 ```javascript // 写在提交form.on 内 var idPicUrls = []; var imgs = $('#previewList').find('img') ; imgs.each(function(idx, each){ idPicUrls.push($(each).attr('data-lePicUrl')) }) if(idPicUrls.length == 0 ){ onion.layer.tipMsg('请添加图片'); return false; } ``` ### 动态获取下拉框选项 #### HTML 模板 ```html <select name="warehouseCode" id="warehouseList"></select> ``` #### JS 模板 在获取所需数据成功后,**使用html()赋值, 但是要记得使用form.render()重新渲染表单** ```javascript var warehouseSelectStr = '<option value="">请选择仓库</option>' for (var key in res.data) { warehouseSelectStr += '<option value="' + res.data[key].code + '">' + res.data[key].name + '</option>' } $('#warehouseList').html(warehouseSelectStr) form.render('select') ``` ![image.png](https://cos.easydoc.net/27100029/files/ka6ctjjf.png) ### 可搜索下拉框 #### HTML模板 需要引入组件 ```html <link rel="stylesheet" href="../../../../css/formSelects-v4.css" media="all" /> <script type="text/javascript" src="../../../js/formSelects-v4.js"></script> ``` HTML 代码, 以搜索权限为例 ```html <div class="layui-col-xs12 layui-col-sm6 pt10 linb-fa linf-fa pb10 pl15 pr15"> <label class="layui-form-label labeltxt g9"> 权限: </label> <div class="layui-input-block"> <select id="authlist" xm-select="authlist" xm-select-search="" xm-select- direction="down" xm-select-search-type="dl"> </select> </div> </div> ``` ![image.png](https://cos.easydoc.net/27100029/files/k9wmlixo.png) #### JS 代码 ##### 需要先引入必要的依赖, 以及数据初始化 ```javascript var formSelects = layui.formSelects; formSelects.render('authlist'); ``` ##### 获取数据 ```javascript function getRoleList(callback){ onion.ajax.get('/system/user/find_role', function (res) { callback && callback(res); }) } ``` ##### 调用函数 ```javascript getRoleList(function (res) { if(res.code ==onion.networkState.SUCC){ var arr = res.data; var str = ''; for(var i = 0; i < arr.length; i++){ // 拼接html str += '<option value="'+arr[i].sysRoleId+'">'+ arr[i].sysRoleName +'</option>' } $('#authlist').html(str); // 写入页面 formSelects.render('authlist'); // 再次重新渲染数据 }); ``` ##### 数据回显 重新渲染 HTML 后, 调用接口, 在获取数据后使用 value() 方法给组件赋值 ```javascript // result.sysRoleIds为接口返回的对应数据 formSelects.value('authlist', result.sysRoleIds); ``` [相关文档见](https://hnzzmsf.github.io/example/example_v4.html) ### 表单检验 使用在需要 `仅输入数字` 等场景 ```html <input type="text" name="memberId" placeholder="" lay-verify="nonNumber"> ``` 可在 `form.verify` 里面写方法进行判断, **不要在标签内直接写正则表达式** ```JavaScript form.verify({ nonNumber: function (value, item) { if (!onion.help.isEmpty(value) && !new RegExp("^[0-9]*$").test(value)) { return '只能填写整数'; } } }); ``` [相关文档见](https://www.layui.com/doc/modules/form.html#verif) ### 选择区域按钮 ![image.png](https://cos.easydoc.net/27100029/files/ka6iqo1t.png) ```html <div class="layui-input jew30 bg-f8 area flexbox je-align-center" onclick="onion.selectSection(this)"> 请选择配送区域 </div> <div class="pt8 pb8 g6 citys"> </div> ``` ```JavaScript onion.selectSection = function (that) { var me = that; } ``` #### 如果是修改, 则需要初始化配送区域列表, 取出后端传来的已有数据 ```javascript var cityIdArr = []; var cityIdCurrent = []; $(me).parent().find('span').each(function (t, v) { cityIdCurrent.push($(v).attr('id')) }) $('.citys').find('span').each(function (i, item) { cityIdArr.push($(item).attr('id')) }) for (var i = 0; i < cityIdArr.length; i++) { for (var t = 0; t < cityIdCurrent.length; t++) { if (cityIdArr[i] == cityIdCurrent[t]) { cityIdArr.splice(i, 1) } } } ``` #### 打开选择页面 ```javascript selectNodes = null layer.open({ type: 2, title: ['选择区域', "color:blue"], area: ["40%", "70%"], scrollbar: true, maxmin: true, btn: ["保存", "取消"], content: ['./section.html?idArr=' + cityIdCurrent + '&cityId=' + cityIdArr], yes: function (index, layero) { // 触发子页面的保存方法 layero.find("iframe").contents().find("#save").trigger("click"); // selectNodes 由子页面赋值 var showSelectNode = selectNodes.filter(function (item) { return item.parentId !== null }); var result = ''; showSelectNode.forEach(function (item) { // 拼接每一个城市标签的html result += renderSingleSection(item); }); // 渲染至标签 $(me).parent().find('.citys').html(result); } }) ``` #### 在子页面中的保存方法 ```javascript $('#save').on('click', function () { // 获取已选择的树节点 zTreeOnCheck() selectedNode = nodes.map(function (item) { return { 'id': item.id, 'name': item.name, 'parentId': item.parentId } }); parent.selectNodes = selectedNode; // 赋值给父页面 var index = parent.layer.getFrameIndex(window.name); parent.layer.close(index); }) ```