layui 子页面写弹出框覆盖父页面,以及给弹框中的表单赋值

在这里插入图片描述
咋说呢,因为对 layui 不太熟悉,这个弹出框搞了好久,看了好多解决方案,大致尝试了一下其中几种,在坑中无法自拔。。。总之终于搞出来了,在这里分享一下我的笔记。

着急的直接 戳这里 看解决代码。


尝试

1、直接在子页面写弹框代码及弹框定位样式

一开始我就直接在 子页面 上写的弹框代码和样式,然后想定位到父页面上。因为position:absolute 定位要找它最近的父级定位元素,如果没有写,就会找到 html,而 iframe 子页面就是一个新的 html 文档,所以没办法定位到父页面上。

子页面

<style>
/* 弹框 */
#diolog{position:absolute;top:0;left:0;right:0;bottom:0;z-index:200;margin:0 auto;background:rgba(0,0,0,.5);
}
#diolog .layui-form{width:660px;background:#fff;margin:0 auto;}
</style><body>...  <!-- 表格 --><div class="content mt20 bg pd20"><button class="layui-btn layui-btn-sm addBtn">新增</button><table class="layui-table" lay-filter="table" id="table"></table></div><!-- 弹出框 id="diolog"生成弹框时会被替换掉--><div id="diolog">  <div class="layui-form"  lay-filter="formDiolog" id="formDiolog"><div class="layui-form-item"><div class="layui-inline"><label class="layui-form-label">行业标识</label><div class="layui-input-inline"><input type="text" name="industryId" autocomplete="off" class="layui-input disabledDom" ></div></div><div class="layui-inline"><label class="layui-form-label">行业名称</label><div class="layui-input-inline"><input type="text" name="industryName" autocomplete="off" class="layui-input"></div></div></div><!--- 。。。。。。 ---></div>
</body>

在这里插入图片描述

2、父页面放空div,覆盖整个父页面

看到帖子说子父页面放一个弹框空div,尝试之后发现:这个遮罩会覆盖整个页面,但是也把弹框中的内容遮挡住了,子页面 z-index 设置 99999 也不管用。目前我还没找到解决办法,有解决的希望能告诉我一下,嘿嘿。

父页面

<style>
#diolog{display:none;position:absolute;top:0;left:0;right:0;bottom:0;z-index:200;margin:0 auto;background:rgba(0,0,0,.5);
}
</style>
<body><!-- 头部 --><header class="boxSizing">...</header><!-- 导航 --><div class="margin clear"><!-- 侧导航 --><ul class="layui-nav layui-nav-tree" lay-filter="layui-nav"></ul>       <!-- 子页面 --><iframe frameborder=0 scrolling="no" width="980"  id="iframe-box" src="/html/views/industry/index.html"></iframe></div><!-- 弹框 --><div id="diolog"></div>  
</body><script>function diologOpen(){$("#diolog").show();}
</script>

子页面,点击新增按钮的时候出现弹框:

$("#addBtn").on("click",function(){$("#formDiolog").show();parent.diologOpen();
})

在这里插入图片描述

3、使用 $.load() 加载弹框内容

经过上面的试验之后,就想把子页面写的 DOM 加载到父级上,于是想到了 jQuery 中的 $.load() 方法。

子页面

<!-- 弹出框 id="diolog"生成弹框时会被替换掉-->
<div id="diolog">  <div class="layui-form"  lay-filter="formDiolog" id="formDiolog">...<div class="layui-form-item"><div class="layui-input-block"><button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button><button class="layui-btn layui-btn-primary diologCloseBtn">取消</button></div></div></div>
</div><script>
//新增,调用父页面封装好的打开弹框的方法$(".addBtn").on("click", function(){//第一个参数:在父页面引用当前页面时的路径,第二个参数:新增为false,//第三个是回调函数,返回表单中输入框的字段和值。parent.loadDiolog("../views/industry/index.html", null, function(params){console.log(params); $.ajax({type: "POST",data: params})})})//监听工具条,表格中的弹框table.on('tool(table)', function(obj){var data = JSON.parse( JSON.stringify(obj.data) );if(obj.event === 'edit'){  //编辑 //把点击的哪一行的数据传给父级中的方法parent.loadDiolog("../views/industry/index.html", data, function(params){console.log(params)})}})
</script>

父页面

<style>#diolog{display:none;position:absolute;top:0;left:0;right:0;bottom:0;z-index:200;margin:0 auto;background:rgba(0,0,0,.5);}#diolog #formDiolog{background:#ff9;width: 660px;margin:200px auto;}
</style><body>...<!-- 弹框 --><div id="diolog"></div>  
</body><script>
//封装打开弹框的方法,第一个参数:在父页面引入需要弹框的页面的路径
//第二个参数:新增为false,修改时传表格中的数据,第三个是回调函数,返回表单中输入框的字段和值。function loadDiolog(src,data,callback){$("#diolog").show(); //显示遮罩$("#diolog").load(src+" #formDiolog",function(){if( data ){  // 当data为 true 时,说明是修改弹框,给弹框中的表单赋值        layui.use('form',function(){var form = layui.form;$("#diolog").find(":input:not(button)").each(function(item){var name = $(this).attr("name");$(this).val(data[name]);});//点击提交按钮,把表单的数据传给子级form.on("submit(formDemo)",function(data){callback(data);})          }); }}); }//点击取消按钮,隐藏整个遮罩层,需要委托给父元素$("#diolog").on("click",".diologClose",function(){$("#diolog").hide()    })
</script>

在这里插入图片描述
效果确实出来了,但是违背了我一开始不想写每个页面路径的想法,除此之外,使用 load 加载 DOM,在性能方面不如 iframe 加载。

  • 关于iframe与$.load()哪个更好
  • iframe可以直接加载页面,但是要付出降低搜索引擎搜索效率的代价,它引入静态文件的方式是完全独立的,简单意思就是,在页面一(父级页面)用iframe加载了页面二(子级页面),页面二的静态文件不用在页面一上加载,降低了每个页面的加载负荷,增加了每个页面的加载效率;
  • 而**$.load()是与它父级页面互相联动的**,如果你想要load某个页面,那么你就要在它的父级页面中引入子级页面的css和js包来控制子页面的样式和效果,这样会增加父级页面的加载负荷,使得父级网页加载变慢,整体影响用户体验性


解决

关于子页面写弹框覆盖父页面,看到很多都是使用 layui 中的弹框,但是基本上都是再引入 iframe 层,对于这种表格和弹框较多的后面管理项目,因为要引入每个表单文件的路径,不太实用。

于是去看了一下官网。最终还是打算用 layui.layer 去写。。。

在子页面写弹框内容:

<body><!-- 查询条件 -->...<!--- 新增修改弹框 ---><div id="diolog">  <div class="layui-form"  lay-filter="formDiolog" id="formDiolog"><div class="layui-form-item"><div class="layui-inline"><label class="layui-form-label">行业标识</label><div class="layui-input-inline"><!-- 给修改弹框需要禁用的输入框添加class名:disabledDom --><input type="text" name="industryId" autocomplete="off" class="layui-input disabledDom" ></div></div><div class="layui-inline"><label class="layui-form-label">行业名称</label><div class="layui-input-inline"><input type="text" name="industryName" autocomplete="off" class="layui-input"></div></div></div><!--- 其他。。。。 ---></div></body><script>$(".addBtn").on("click", function(){ //点击新增按钮,出现弹框diologOpen({ title: "新增行业信息" }, function (data) {    //调用打开弹框的方法console.log(data); //data 为弹出框表单中的字段和值,在这里调用新增的接口$.ajax({type: "POST",data: data//....})})});//监听工具条table.on('tool(table)', function(obj){var data = JSON.parse( JSON.stringify(obj.data) ); //赋值时注意深浅拷贝if(obj.event === 'edit'){  //编辑 //点击编辑按钮时,需要给弹框传的值var formData = {title: "编辑行业信息" ,formData: data}diologOpen(formData, function (data) {  //调用打开弹框的方法console.log(data); //data 为弹出框表单中的字段和值,在这里调用新增的接口})});// 封装弹出框,给表单赋值.
//formData是传给弹框的值,是一个对象,callback回调函数,是点击弹框中的确认要做的操作。
function diologOpen(data, callback) {  layui.use(['layer','form'], function(){var form = layui.form;var index = parent.layer.open({type: 1,  //0信息框,默认;1页面层;2iframe层;3加载层;4tips层title: formData.title,content: $("#diolog").html(), //注意后面的.html()btn: ['确认', '取消'],success: function(layero){ //打开弹框的回调// 携带两个参数,分别是layero当前层DOM,index当前层索引if( data.formData ){  //有数据时为修改弹框,修改弹框的表单赋值layero.find(':input').each(function(){  //给表单的输入框赋值,注意 input 前面的:不能省$(this).val( data.formData[$(this).attr("name")] );});layero.find("input.disabledDom").addClass("noDrap"); //修改操作通常标识是不能改的layero.find("input.disabledDom").attr("disabled","disabled"); //禁用输入框form.render();}        },yes: function (index, layero) {   //点击确认按钮后,把输入框的数据导出到回调函数中。//两个参数index当前层索引、layero当前层DOM对象var data = {}layero.find(':input').each(function(){data[$(this).attr("name")] = $(this).val();})callback(data); parent.layer.close(index); //关闭弹框}});})
}
</script>

父页面:

<style>.noDrap{cursor: no-drop;}/*禁用*/#formDiolog input{height:30px;line-height: 30px;}#formDiolog div label.layui-form-label{text-align: left;padding-right:0;padding-top:0;padding-bottom:0; line-height: 30px;}#formDiolog .layui-btn, .layui-edge, .layui-inline, img{vertical-align: top;}
</style><body></body><!-- 为防止出错,父页面添加依赖 -->
<script>layui.use("layer",function(){var layer = layui.layer;})
</script>

注意:

  1. 因为弹框加到父级上了,所以弹框中的样式要写在父级的样式文件中。
  2. 表单赋值/取值有个 form.val() 方法,这里使用会没有效果,原因也是因为 弹框中内容被加到父级上了,而表单赋值是写在子页面上的,所以在子页面做表单赋值操作时要手动去写赋值操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html实现文字垂直居中且设置间隔

使用table和table-call布局 将表格作为一个table表&#xff0c;使用table-cell定义每个单元格的布局为table-cell, 抛出display的有效值 单元格中间的间隔使用 border-spacing:10px; border-collapse: separate;定义单元格vertical-align: middle; display: table-cell;代码源码…

Hibernate隐藏的宝石:pooled-lo优化器

介绍 在这篇文章中&#xff0c;我们将揭示一个序列标识符生成器&#xff0c;​​它结合了标识符分配效率和与其他外部系统的互操作性&#xff08;同时访问底层数据库系统&#xff09;。 传统上&#xff0c;有两种序列标识符策略可供选择。 序列标识符&#xff0c;对于每个新值…

vue inheritAttrs、$attrs和$listeners使用

inheritAttrs、$attrs和$listeners使用场景&#xff1a; 组件传值&#xff0c;尤其是祖孙组件有跨度的传值。 &#xff08;1&#xff09;inheritAttrs 属性说明&#xff1a;https://cn.vuejs.org/v2/api/#inheritAttrs 说明比较晦涩。 组件传值一般是通过props传值的。inhe…

仍不切换到Java 8的6个理由

Java 8很棒。 期。 但是……在我们有机会玩耍并玩弄它之后&#xff0c;就该退出了&#xff0c;避免吃盐。 所有的好东西都是有代价的&#xff0c;在这篇文章中&#xff0c;我将分享Java 8的主要痛点。请确保在升级和放弃7之前您已经意识到了这些痛点。 1.并行流实际上会使您减…

鼠标滚轮切屏效果

某天发现一个网站《北京新鸿儒世纪网络技术有限公司》&#xff0c;一开始打开&#xff0c;哇&#xff0c;好简单啊&#xff0c;特别是首页&#xff0c;就一张图&#xff0c;后来发现里面有挺多小细节的&#xff0c;比如&#xff1a;做了媒体响应式、滚轮切屏&#xff08;第一次…

小程序 自定义组件报错[“usingComponents“][“my-list“] 未找到

根据官网案例写了一个自定义组件&#xff0c;引入时总是报这个错误。 后面在社区里面找到了解决办法&#xff0c;把上面配置中改成&#xff1a;"my-list": "/components/my-list/my-list" 就可以了。 具体原因&#xff1a;官方文档上的自定义组件是 4 个文…

http 请求报文和响应报文

1、请求报文 示例&#xff1a; 2、响应报文 示例&#xff1a; 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

小程序 封装table组件

实在是懒得自己封装了&#xff0c;就在网上找了一下别人封装好的&#xff0c;这里主要参考的是 灰信网上的一篇文章&#xff0c;我在他的基础上改了一下样式&#xff0c;动态生成列表每一列列宽。 表格可左右横向滑动 一、子页面 table.wxml <scroll-view class"ta…

服务器--停止启动服务,查看日志文件

停止启动服务 ./shutdown.sh 停止掉当前服务 ./startup.sh 启动当前服务 例如&#xff1a; Tomcat服务器&#xff1a;在apache-tomcat-7.0.82/bin 目录下&#xff0c;sh shutdown.sh 停止掉当前服务&#xff0c;sh startup.sh 启动当前服务 查看日志文件&#xff1a; Tomcat查看…

linq 解决winForm中控件CheckedListBox操作的问题。(转载)

1.获取CheckedListBox选中项的文本的字符串&#xff0c;并用分隔符连接。系统没有提供相应的属性&#xff0c;方法。 这里我们利用3.0的特性给其来个扩展方法,如下&#xff1a; public static stringGetCheckedItemsText(thisCheckedListBox box) { stringre…

Glass Fish 4.0.1中的Jersey SSE功能

Glass Fish为各种Java EE规范捆绑了不同的参考实现&#xff0c;例如&#xff0c;CDI的Weld&#xff0c;JSF的Mojarra&#xff0c;WebSocket的Tyrus&#xff0c;JAX-RS的Jersey。 Glass Fish 4.0.1即将发布&#xff0c;并计划涵盖许多组件/模块的更新&#xff0c;这些组件/模块当…

canvas1:简单介绍、开始使用、画直线+虚线

目录 一、简单介绍 二、开始使用 三、画直线、虚线 3.1 画直线 1. 画直线的步骤&#xff1a; 2. 设置直线的样式 3. 绘制多条直线 3.2 画虚线 四、整理使用到的方法&#xff1a; 参考了廖雪峰老师的笔记。 一、简单介绍 Canvas是 HTML5新增的组件&#xff0c;它就像…

Test of etco

Test of etco 转载于:https://www.cnblogs.com/yanjunz/archive/2010/12/22/1913852.html

js setTimeout和setInterval区别

1、区别 2、示例代码 <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><meta http-equiv"X-UA-Compatibl…

将Android源码集成到Eclipse中的方法

1、 首先&#xff0c;下载Android源码&#xff1a; Android 2.0源码下载地址&#xff1a;http://download.csdn.net/source/2931366 Android 2.1源码下载地址&#xff1a;http://download.csdn.net/source/2931364 2、 然后&#xff0c;新建一个名为【sources】的文件夹&#x…

为GWT设置开发环境

介绍 这是旨在用Java开发跨平台移动应用程序的系列文章的一部分 。 在此博客文章中&#xff0c;我们将了解GWT是什么&#xff0c;并为GWT设置开发环境。 GWT是一个开源开发工具包&#xff0c;用于开发基于浏览器的复杂Ajax应用程序。 使用GWT&#xff0c;您可以用Java开发Rich…

vue slot的使用

一、自定义组件中多个 slot 很久之前就想把表格封装了&#xff0c;奈何那时太过担心自己的技术。今天趁着劲头大致看了一下&#xff0c;把表格封装了&#xff0c;倒是比想象中的要简单很多 O(∩_∩)O 哈哈~ 暂且不考虑细节&#xff0c;大致封装表格要考虑的有&#xff1a;是否…

虫师Selenium2+Python_6、Selenium IDE

P155——创建测试用例录制脚本编辑脚本定位辅助P159——Selenium IDE 命令在浏览器中打开URL&#xff0c;可以接受相对路径和绝对路径两种形式openopen(url)单击链接、按钮、复选框和单选框click(elementLocator)模拟键盘的输入&#xff0c;向指定的input中输入值type(inputLoc…

flow 静态类型检查 js

1、flow介绍 https://ustbhuangyi.github.io/vue-analysis/prepare/flow.html#为什么用-flow 2、使用 &#xff08;1&#xff09;安装flow &#xff08;2&#xff09;项目目录的test.js文件 类型推断&#xff1a; /*flow*/function split(str) {return str.split( )}split(1…

页面监听,一段时间内不操作网页,就自动跳转到登录页

需求&#xff1a;用户在 5 分钟内没有操作网页&#xff0c;就自动跳转到登录页。 环境&#xff1a;jquery 项目&#xff0c;有公共的 js 文件 。 在所有页面都引用的 js 文件中添加下面代码&#xff1a; //判断用户是否在5分钟内未操作页面&#xff0c;如果没有操作&#xff…