在开发中经常会遇到点击按钮弹出展示表单,在表单中填写信息后,点击保存,最后返回列表页的情况。
我们想实现的比较友好的效果通常是:用户点击按钮弹出子窗口,填写完子窗口中的表单信息后,点击子窗口中的保存按钮,页面提示保存成功,并关闭子窗口,最后刷新父页面。
为了更加优雅的弹出子窗口,我们使用了layer这一款优秀的jQuery插件。在使用过程中,可以很方便的弹出我们想要的页面,例如表单填写页面。
例如如下页面:
<!DOCTYPE html> <html lang="en"> <head> <title> 弹窗测试 </title> <meta charset="utf-8"/> <script src="https://cdn.bootcss.com/jquery/2.0.2/jquery.min.js"></script> <script src="https://cdn.bootcss.com/layer/3.0.1/layer.min.js"></script> </head> <body> <button id="parentIframe">点击弹出窗口</button> </body> </html> <script> function refresh() { location.reload(); } //弹出一个iframe层 $('#parentIframe').on('click', function () { layer.open({ type: 2, title: '点击弹出窗口', maxmin: true, shadeClose: true, //点击遮罩关闭层 area: ['800px', '520px'], content: 'http://127.0.0.1/test/layer/form.php' }); }); </script>
点击“点击弹出窗口”按钮,页面会弹出子窗口显示http://127.0.0.1/test/layer/form.php的页面内容,form.php的代码如下:
<?php if ($_POST) { //处理你的业务... echo "<script>parent.parent.layer.closeAll();parent.parent.layer.msg('添加成功,页面正在刷新');parent.parent.setTimeout('refresh()',2000);</script>"; die; } ?> <!DOCTYPE html> <html lang="en"> <head> <title> 弹窗测试 </title> <meta charset="utf-8"/> </head> <body> <iframe name="iframe" id="iframe" style="display:none"></iframe> <form action="#" method="post" target="iframe"> <table border="1"> <tr> <td>姓名</td> <td><input type="text" name="username"/></td> </tr> <tr> <td>年龄</td> <td><input type="text" name="age"/></td> </tr> <tr> <td colspan='2'><input type="submit" value="提交"/> </td> </tr> </table> </form> </body> </html>
注意表单form的target属性是指向的本页面的iframe,target的名称即为iframe的name。当填写了表单上的信息后,点击提交按钮,页面会将form表单中的信息提交到iframe中,由于iframe没有指定src属性,所以iframe的地址是页面自己,同时设置了display:none,所以是不可见的(为了便于观察效果,你也可以暂时先把display:none删除)。所以等同于表单提交到页面自身,只不过是展示在了自身的iframe里。自身的php代码里识别到了post过来的数据,则会输出一句js代码,js代码的目的是关闭顶级父窗口的layer弹出窗,并在顶层父窗口中显示提示信息,最后让顶级父页面在两秒钟后刷新自己。