本案例是我在民主测评项目中实际遇到的,在Organtag.jsp中需要刷新vote.jsp
批量移交,在vote.jsp页面选择了大量的人员,通过post提交到后台,然后弹出
zhongjianAdmin.jsp,在此页面选择中间管理员,然后通过AJAX提交,返回一个
结果,用户点击确认之后,刷新vote.jsp,然后关闭自己
在上面的两个案例中的会出现这样的问题,如果在vote.jsp中通过js中的window.open打开子窗口一般会被浏览器阻止,所有不应采用
这种方法.当时为了避免被阻止就采用上面的案例中的模式,通过form表单提交到后台,然后再跳转到一个新的页面,其实这样有的时候也会被
浏览器阻止,但是浏览器给出阻止提示.后台通过从交互设计的那里了解到,对于弹出窗口类似问题可以采用的DIV弹出.
在保障服务中的订餐系统采用了上述利用DIV弹出窗口的形式,使用了ajaxAnywhere控件(姑且这么称呼)局部刷新,这样就解决了浏览器
阻止小窗口的问题.
另外一个问题就是子窗口(这里的子窗口指的是Organtag.jsp和zhongjianAdmin.jsp)刷新父窗口vote.jsp,如果直接使用下面语句刷新,
// self.opener.location.reload(); // 刷新父窗口
// window.opener.location.href=window.opener.location.href;
浏览器会弹出这样的窗口(在IE6中大多时候会出现)
和同事的讨论,认为是因为采用了post提交的方式引起的,如果采用get方式就不会引起这个问题(未验证),那么怎么避免这个弹出窗口呢?
在Js中使用这样的语句:
// window.parent.opener.ec.submit();(案例一)
// window.parent 是获得当前页面的框架,opener是获得弹出这个框架的页面或者框架的引用,这里的刷新实际上是刷新整个vote.jsp
// vote.jsp也有可能是一个框架
// window.opener.ec.submit();(案例二)
// 理解了第一条语句,第二条语句就很好理解了,因为第二案例的子窗口没有在框架中,所有直接通过opener获得了打开自己的窗口
这里的原理就是提交父窗口的form,在jsp页面中的使用的是ec:table