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;代码源码…

入世与出世

同情恰好有两种。一种同情怯懦感伤&#xff0c;实际上只是心灵的焦灼。看到别人的不幸&#xff0c;急于尽快脱身出来&#xff0c;以免受到感动&#xff0c;陷入难堪的境地。这种同情根本不是对别人的痛苦抱有同感&#xff0c;而只是本能地予以抗拒&#xff0c;免得它触及自己的…

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…

鼠标滚轮事件及解决滚轮事件多次触发问题

转载&#xff1a;https://www.cnblogs.com/jjxhp/p/11736066.html#_label0 一、滚轮事件的 js 写法 二、jQuery写法 三、参考 四、滚轮事件滚动过快&#xff0c;事件触发两次 一、js //判断鼠标滚轮滚动方向 if (window.addEventListener){ //FF,火狐浏览器会识别该方法wind…

Leetcode 2976. Minimum Cost to Convert String I

Leetcode 2976. Minimum Cost to Convert String I 1. 解题思路2. 代码实现 题目链接&#xff1a;2976. Minimum Cost to Convert String I 1. 解题思路 这道题思路上其实是非常直接的&#xff0c;本质上就是给出有向图之后&#xff0c;求出有向图上任意两点之间的最短距离&…

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

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

硬币回收价格

1957年 1分 1元1960年 1分 80元 1962年 1分 30元1965年 1分 350元1966年 1分 180元1967年 1分 350元1968年 1分 88元1969年 1分 150元1977年 1分 320元1981年 1分 5元1988年 1分 300元1989年 1分 150元1990年 1分 180元1995年 1分 0.5元1955年 2分 15元1957年 2分 2元1958年 …

13 字符串相关函数

# ### 字符串相关函数 # *capitalize 字符串首字母大写 strvar "this is a dog" res strvar.capitalize() print(res)# *title 每个单词的首字母大写 (非字母隔开的单词) strvar "this is123a dog" res strvar.title() print(res)# *upper 将所有字母变…

Vue 生命周期LIFECYCLE是8个吗?

vue生命周期钩子个数是&#xff1a;11个。 export const LIFECYCLE_HOOKS [beforeCreate,created,beforeMount,mounted,beforeUpdate,updated,beforeDestroy,destroyed,activated,deactivated,errorCaptured] github地址&#xff1a; https://github.com/vuejs/vue/blob/dev/…

鼠标滚轮切屏效果

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

JavaFX技巧11:更新只读属性

自定义控件通常具有“只读”属性。 这意味着不能从控件外部进行设置&#xff0c;甚至不能从自己的皮肤类别进行设置。 通常&#xff0c;控件的行为会导致更改只读属性。 在JavaFX中&#xff0c;可以在控件本身和皮肤中实现此行为。 因此&#xff0c;有时我们最终希望通过皮肤来…

DVT和ADVT - 为数不多的DICOM测试工具说明AND下载

1、 前言做DICOM研究、开发和应用的人&#xff0c;最头疼的就是没有充分的工具和手段来进行测试&#xff0c;所以无法知道自己的程序、软件是否正确&#xff0c;能否正确地与其他设备进行DICOM连接&#xff1f;连接出错的原因在哪里&#xff1f;改正的话该从哪里下手&#xff1…

高阶函数 实现sum(2)(3) 柯里化

<!DOCTYPE html><html><head><meta charset"utf-8" /><title>高阶函数 实现sum(2)(3)</title></head><body><script type"text/javascript">function add() {var args [].slice.call(arguments);v…

设置和重置ssh key

查看本地是否有已经生成好的ssh key $ cat ~/.ssh/id_rsa.pub 若有,先删除: $ cd ~ $ rm -rf .ssh 重新生成ssh key ssh-keygen -t rsa -C "youemailexample.com" 提示输入密码或确认密码 直接全部回车即可 查看新生成的ssh key $ cat ~/.ssh/id_rsa.pub 然后获取到密…

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

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

编写干净的测试–验证或不验证

在编写使用模拟对象的单元测试时&#xff0c;请遵循以下步骤&#xff1a; 配置我们的模拟对象的行为。 调用测试的方法。 验证是否已调用模拟对象的正确方法。 第三步的描述实际上有点误导&#xff0c;因为通常我们最终会验证是否调用了正确的方法以及未调用模拟对象的其他…

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查看…