很多人第一次用layuiadmin的admin.popup或者admin.popupRight通常有些疑问。毕竟在layuiadmin的文档里面就只有一个示例代码,再者就是打开示例看源码,但示例就两个。这对于天马行空的需求来说根本不够用。其实文档中popup的解释说了:“弹出一个 layuiAdmin 主题风格的 layer 层,参数 options 跟 layer.open(options) 完全相同”。就是在layer组件上封装了一层,自动帮用户添加了主题风格的参数。但两种风格导致用户觉得popup和layer是两个不同的组件,顿时就无从下手,无法将popup当作layer来用。下面我就来初步解说一下。
admin.popupRight({ id: 'LAY_adminPopupLayerTest' ,success: function(){ $('#'+ this.id).html('<div style="padding: 20px;">放入内容</div>'); //admin.view(this.id).render('system/xxx',{这里是传给模板的参数,在模板使用d.params.XXX获取}) } });
看上面的官方示例的代码。参考layer文档的id属性,设置该值后,不管是什么类型的层,都只允许同时弹出一个。其实就是创建一个以这参数id为div元素的id的弹窗,通常来说我们用layer时,直接是用content属性,content:$("#xxx"),那么有了$("#xxx")这个dom做弹窗的内容主体,layer就不需要创建以参数id为元素id的div;如果content是html字符串时,又没有给参数id时,layer会根据自己的规则自动创建一个id值,有机会出现layer自动产生的id重复了,导致不再弹出新窗口。layer的文档中有一句话“这里content是一个DOM,注意:最好该元素要存放在body最外层,否则可能被其它的相对元素所影响”。在很多时候,我们需要弹窗的dom元素并不是body直接子节点,所以content不能传dom元素,只能传html字符串。layer自行创建的div都是body的子节点,能避免出现遮罩挡住了弹窗的情况。
再说success属性,这个是对应layer的success回调方法,是在弹窗完成弹出后触发。
$('#'+ this.id).html('<div style="padding: 20px;">放入内容</div>');
这句语句是在弹窗弹出完成了,有了layer生成的内容dom元素后,人工往弹窗的正文部分放入需要展示的内容。
admin.popupRight({ id: 'LAY_adminPopupLayerTest' ,success: function(){ $('#'+ this.id).html('<div style="padding: 20px;">放入内容</div>'); } }); //等同于 admin.popupRight({ id: 'LAY_adminPopupLayerTest' ,content:'<div style="padding: 20px;">放入内容</div>' });
但是对于
admin.view(this.id).render('system/xxx')
这个view渲染就只能在success回调中执行,毕竟容器dom的id是view的必须属性。这里向view指定了容器dom的id再告诉view从何加载弹出内容。
在这里,view加载内容是layuiadmin单页版用户经常使用的方法,然后没单独用过layer,上手直接用admin.popup,那么自然没见过content属性,自然而然先入为主地认为只能通过view来加载内容了,加载网站本身的视图页面内容没什么问题,但是一旦要加载非单页版的视图页面时,就出问题了。比如说弹窗内容是嵌入个百度。好了,示例只有id和view,又没弄懂popup和layer的关系,只能钻牛角尖往view那里想如何引入百度地址了。如果了解了popup传入的参数其实是传入给layer后,就能很轻松地解决问题,直接按layer的iframe层参数形式传入即可。
admin.popupRight({ id: 'LAY_adminPopupLayerTest' ,type:2 ,content:"https://m.baidu.com" });
所以,使用admin.popup或者admin.popupRight时谨记是在使用layer组件即可。