layer.js,一个jquery的插件,可以用它来做信息提示,弹出层等。
官方demo地址:http://layer.layui.com/
官方api地址:http://layer.layui.com/api.html
使用layer.js做弹出层时,在弹出层里直接提交form表单,返回的画面仍然停留在弹出层里。 我们想在弹出层里提交form表单后关闭弹出层,并跳转到另一个画面。
0.引入layer.js
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
pageContext.setAttribute("basePath", basePath);
%>
1.在父画面里定义一个隐藏的div
2.在父画面打开弹出层,并定义弹出层关闭时要回调的函数
layer.open({
type: 2,
title: ['导入信息', 'background-color: #00bb9d;text-align:center;font-size:18px;'],
shadeClose: true,
shade: false,
maxmin: true,
area: ['893px', '600px'],
content: 'abc/xxx.action?id='+id,
end: function(){
// 如果是通过单击关闭按钮关闭弹出层,父画面没有此表单
if($("#popupForm").length === 1){
$("#popupForm").submit();
}
}
});
3.弹出层里提交form表单的时候将form表单复制到父画面里,然后关闭弹出层。
$(function(){
$("#saveBtn").click(function(){
// 将表单复制到父画面,在父页面的回调函数里提交表单
var popupForm= $(parent.document.body).children("div[id='popupFormDiv']").append($("#popupForm"));
var index = parent.layer.getFrameIndex(window.name); //获取窗口索引
parent.layer.close(index);
});
});
但是这样提交的话,弹出层会在页面上会停留一段时间,后台响应时间越长,弹出层在页面上停留的时间也越长。 不建议这样做。
这里说一个注意点。动态构造一个form表单一定要append到body元素里,不然提交不了。
$('').appendTo('body').submit();
弹出层右上角有一个关闭按钮,如果点击这个按钮,我们就没有机会将表单复制到父画面里的div里。 所以要在回调函数end里判断一下是否有popupForm这个表单。 然后提交这个表单即可。
$("#popupForm").length === 1
if($("#popupForm")){
// to do
}
如果只是给父画面传一个值,官方有提到,只需这样:
parent.$('#parentIframe').text('我被改变了');
可以debug看看,这里的parent就是window对象。
关于parent这个东西,可参考这篇文章:
http://hubin19860118-163-com.iteye.com/blog/961413
弹出层的form表单:
最后啰嗦一下:
如果你的action要重定向到另一个命名空间下的action,并且传递参数给那个action:
/cc
cc
${someId}
${resultMsg}
bb所在的action里 至少有someId和resultMsg的getter
cc所在的action里至少有searchForm和resultMsg的setter。
searchForm类里要有someId的 setter和getter。