弹出窗口刷新它的父页面时。出现不重新发送信息,则无法刷新网页
以下范例为演示解决办法使用PHP实现全当交流,没有什么技术难度一点小技巧,权当与朋友交流。
在公共模块中新建函数
PHP:
function requestParameter(){
$fromstr="
";$requestKeys=array_keys($_REQUEST);
$requestValues=array_values($_REQUEST);
for($i=0;$i
$fromstr.="";
}
$fromstr.="
";return $fromstr;
}
?>
JAVA:
public class UtilTool {
public static Map getParameterMap(HttpServletRequest request) {
Map paramMap = new LinkedMap();
String pathInfoStr = request.getPathInfo();
if (pathInfoStr != null && pathInfoStr.length() > 0) {
if (!pathInfoStr.endsWith("/")) pathInfoStr += "/";
int current = pathInfoStr.indexOf('/');
int last = current;
while ((current = pathInfoStr.indexOf('/', last + 1)) != -1) {
String element = pathInfoStr.substring(last + 1, current);
last = current;
if (element.charAt(0) == '~' && element.indexOf('=') > -1) {
String name = element.substring(1, element.indexOf('='));
String value = element.substring(element.indexOf('=') + 1);
paramMap.put(name, value);
}
}
}
java.util.Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
paramMap.put(name, request.getParameter(name));
}
if (paramMap.size() == 0) {
Map multiPartMap = (Map) request.getAttribute("multiPartMap");
if (multiPartMap != null && multiPartMap.size() > 0) {
paramMap.putAll(multiPartMap);
}
}
return paramMap;
}
public static String requestParameter(HttpServletRequest request){
String fromstr="
";Enumeration requestKeys = request.getParameterNames();
Map requestValues=UtilTool.getParameterMap(request);
String rkey = null;
for(;requestKeys.hasMoreElements();){
rkey = (String) requestKeys.nextElement();
fromstr+="";
}
fromstr+="
";return fromstr;
}
}
在模版页面中调用此函数并输出返回的字符串。
PHP:
=requestParameter();?>
JAVA:
这样当需要调用弹出窗口并刷新当前页时如:
针对当前页的刷新
window.location.reload();
改为
reload();
原理:
很多WEB程序员比如我,比较喜欢让地址栏保持清爽的状态,切换页面地址或进行列表翻页处理的时候,尽量都用POST方式提交数据,但这样就引发了一个怪异的问题,就是当弹出窗口关闭后需要同时刷新父页面时IE就会出现"不重新发送信息,则无法刷新网页。"的警告,使得本来不错的想法不能得到完美实现,迫不得已,只能改用GET提交方式,比较郁闷得去做字符串连接操作。
IE认为POST提交的信息应该是一次性的,当提POST交后刷新页面的时候(如按F5或调用window.location.reload();时)IE将会认为这是重复提交(所谓重复提交:IE对其的理解就是把提交过的表单用刷新的办法在提交一次。),所以需要用户进行确认才能允许刷新页面,虽然是好心,解决办法却比较笨,招得怨声四起。
其实,在测试中可以发现,如果不用window.location.reload();提交刷新,而直接提交一个表单,那怕这个表单已经重复提交了上万次,IE也不会拒绝(还真是好骗)。
那么解决办法就来了,既然提交表单不会拒绝,那么我们就做个表单刷新用,首先我们要找到刷新页面时到底有什么东西要被重复提交,这就涉及到一个服务器对象REQUEST,暂且这样称呼,做WEB开发的人对它都非常熟悉,不管是POST方式还是GET方式甚至是混合提交的方式提交的数据,都存储在这个对象中,那么把它的数据项拿出来做成一个个隐藏域放在表单中,ACTION设为_SELF并执行提交,那么效果将与按F5然后点那个倒霉的“重试”效果是一样的。
以上的例子中我首先声明了一个方法requestParameter(),将其放在一个公共页面中,然后把调用
=requestParameter();?>
也放在公共页面中,将返回一个包含REQUEST对象中的所有项目的隐藏表单,并附带一个提交的JAVASCRIPT方法reload();,这样,只要在应用页面中用到弹出窗口刷新父窗口的调用时,调用reload();即可。
其他的语言如ASP、JSP等处理办法也是相同的,用PHP做例子的好处是代码量最少呵呵,至于这种方法会有什么副作用,我还没有发现,欢迎有朋友给与指正。