`
837062099
  • 浏览: 111587 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ajax和iframe的使用遇到的问题

阅读更多
在公司做的不是web软件,一直想自己学习并锻炼自己。
这几天有空就写自己的一个web小系统,感觉第一次写的界面太丑了,就打算这次用ajax提高用户体验,在网上当了一个页面后就打算用一个页面做一个系统。
通过四五天的努力,写了一个模块,貌似没发现功能上的问题。然后突然想看看用户session过期时提交一个请求时能不能完成老版本的功能,原来功能如下:提交请求后发现没登录,会先跳转到用户登录页面,然后成功登陆后自动执行之前没执行的请求,和淘宝网的实现一样。结果竟然不行。关键代码如下:
<%
	String contextPath = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ contextPath + "/";

	RedirectBean bean = (RedirectBean) request.getAttribute("redirectBean");
	String method = "POST";
	String requestName = "homePage.action";
	if (bean != null) {
		method = ComUtil.changeNullVal(bean.getRequestWay(),method);
		requestName = ComUtil.changeNullVal(bean.getRequest(),requestName);
	}
%>

<head>
<base href="<%=basePath%>"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>RedirectPage</title>
</head>
<!-- <body onload="document.getElementById('autoform').submit();"> -->
<body>
		<form id="autoform" action="<%=requestName %>" method="<%=method%>" target="_top">
			跳转中....
		<%
			if (bean != null) {
				Iterator<SimpleEntry> it = bean.iterator();
				while (it.hasNext()) {
					SimpleEntry en = it.next();
		%>
		<input type="hidden" name="<%=en.getName()%>" value="<%=en.getValue()%>" />
		<%
			}
			}
		%>
	</form>
	<script type="text/javascript">
		document.getElementById('autoform').submit();
	</script>
	</body>


这时一个跳转页面,自动提交表单跳转,这段代码会被之前的ajax请求接收到,然后
<div id="target"></div>
写到主框架页面的这个div标签中,这个时候应该是自动提交表单的,但是竟然没有跳转!!!然后我发现这个语句
<body onload="document.getElementById('autoform').submit();"> 
是不是和主框架页面的某些东西冲突了,onload事件不起作用。果然如此,神奇的javascript,我突然感觉onload事件没什么用,因为我在页面底部如下方法代替就可以执行脚本了,
<script type="text/javascript">
		document.getElementById('autoform').submit();
	</script>
效果和onload是一样的,页面也约等于load完成了。
这个时候果然可以正常的提交了,登录后一切正常。
下面更蛋疼的事情发生了:点击导航栏的链接后从发现chrome的debug工具中看见一次就重复提交几十次请求。并且还在翻倍上升,好久都找不到原因,然后回忆起所有请求都用ajax,搞得javascript写的很恶心,肯定是js重复冲突造成的。于是
决定放弃改用iframe结合ajax。
以前从来没用过iframe,一下子就考虑到了上面提到的问题,又被恶心到了,我一直在想上面那个跳转页面被返回在iframe中后,要如何跳出iframe来提交请求,那样才能使整个框架页面返回登录页面,否则仅仅iframe中是个登录页面,就错了。于是乎又恶心了,用javascript搞,最后把返回的页面拿到了iframe外面,这回总可以把整个页面跳转回登录页了吧。
奶奶的问题又出现了,主页面和这个跳转页面之间有冲突,尼玛啊,伤不起,最后想到target元素,因为之前一直以为只有超链接标签可以target,尼玛,原来form竟然也有target,哎,这不就简单了吗,
target="_top"
,OK,这样这个跳转页面在iframe里提交,就不会和主框架页面冲突了,而且还能跳出iframe提交,也使整个框架页面都返回登录页面。

iframe解决了我原本几个页面(ajax返回的页面)组合成一个页面时冲突的问题,还可以部分代替ajax,非常不错。


ps:
补充点target的属性:
<form>和超链接<a>都有target属性。

有 4 个保留的目标名称用作特殊的文档重定向操作:
_blank
浏览器总在一个新打开、未命名的窗口中载入目标文档。
_self
这个目标的值对所有没有指定目标的 <a> 标签是默认目标,它使得目标文档载入并显示在相同的框架或者窗口中作为源文档。这个目标是多余且不必要的,除非和文档标题 <base> 标签中的 target 属性一起使用。
_parent
这个目标使得文档载入父窗口或者包含来超链接引用的框架的框架集。如果这个引用是在窗口或者在顶级框架中,那么它与目标 _self 等效。
_top
这个目标使得文档载入包含这个超链接的窗口,用 _top 目标将会清除所有被包含的框架并将文档载入整个浏览器窗口。

当然target还可以是窗口(比如弹出窗口)或者框架(frameset、iframe等),如:
<a href="http://www.baidu.com" target="myHidFrame">click1</a>
<iframe name="myHidFrame" src = "" frameborder="0"scrolling='auto'></iframe>
百度页面就会出现在iframe中。
参考:http://wangzjie.iteye.com/blog/628204
分享到:
评论

相关推荐

    关于iframe跨域POST提交的方法示例

    所以自己对跨域有一定的概念性了解,知道什么是跨域以及解决跨域的方法,但是具体实际从来没有操作过,直到最近在公司项目中,遇到了一个需要使iframe跨域进行POST提交的实际案例,我才明白具体如何使用iframe进行...

    PHP的AJAX技术实现文件异步上传

    异步的文件上传是在现代的AJAX实现的Web应用里面经常要遇到,必须解决的问题。但是标准的AJAX类(XmlHttpRequest)无法实现传输 文件的功能。因此,这里讨论的内容就是如何在AJAX的技术的基础之上构建异步的文件上传...

    Ajax跨域问题 解决方案

    关于跨域,有N种类型,本文只专注于ajax请求跨域(,ajax跨域只是...o表现(整理了一些遇到的问题以及解决方案) 如何解决ajax跨域 oJSONP方式 oCORS方式 o代理请求方式 如何分析ajax跨域 ohttp抓包的分析 o一些示例

    ajax跨域访问遇到的问题及解决方案

    而script、script、iframe标签的src属性就不存在跨域的问题,所以Ajax跨域就是利用这一点以及js对JSON的支持,外部服务只要给Ajax的请求响应一段JS代码或JSON数据,就能被Ajax获取到。 由于安全方面的原因, 客户端js...

    ajax跨域,这应该是最全的解决方案了

    本文只专注于ajax请求跨域(ajax跨域只是属于浏览器"同源策略"中的一部分,其它的还有Cookie跨域iframe跨域,LocalStorage跨域等这里不做介绍),内容大概如下:什么是ajax跨域原理表现(整理了一些遇到的问题以及解决...

    iFrame 框架在多页面间相互传值的实例

    这个例子我觉得很实用,相信有不少朋友都遇到过,在嵌套页面与被嵌页面间传值,是个棘手问题,曾经也让我束手无策,现在好了,这个实例可帮了你的大忙,不但解释清楚了iFrame页面间的传值问题,也让你了解了Ajax的...

    关于Iframe如何跨域访问Cookie和Session的解决方法

    最近做登录系统的整合,其中遇到的一个最关键的问题为在一个统一的后台里需要无障碍的访问另外一个系统后台,这个系统是第三方提供的一个加过密的系统,后台自动登录接口是自己分析出来的,没有单独提供,当从统一...

    ExtAspNet_v2.3.2_dll

    -修正了使用IFrameUrl的Tab在切换过程中会重复加载的问题,这是一个在v2.1.6引入的问题(feedback:eroach)。 -修正了启用AutoPostBack的Grid,其RowClick会覆盖LinkButtonField, HyperLinkField, CheckBoxField的...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正了使用IFrameUrl的Tab在切换过程中会重复加载的问题,这是一个在v2.1.6引入的问题(feedback:eroach)。 -修正了启用AutoPostBack的Grid,其RowClick会覆盖LinkButtonField, HyperLinkField, CheckBoxField的...

    毕业设计基于LayUI + SSM的前后台一体外卖点餐系统源码+数据库,大学生食堂外卖点餐系统

    (1) 全系统无刷新 :宿递整个系统采用了无刷新的方式,用户在使用的过程中将不会遇到浏览器页面级别的操作,所有的跳转都基于iFrame内联框架进行。全系统全程采用了AJAX异步请求操作,摒弃了同步请求中用户等待而...

    基于SSM框架的毕业设计大学生食堂外卖点餐系统源码+数据库+教程说明.zip

    (1) 全系统无刷新 :基于SSM框架的毕业设计大学生食堂外卖点餐系整个系统采用了无刷新的方式,用户在使用的过程中将不会遇到浏览器页面级别的操作,所有的跳转都基于iFrame内联框架进行。全系统全程采用了AJAX异步...

    Web应用前端技术的探索与实践

    3.2.5 大量使用ajax的DIV局部页面,会遇到的一些难点 6 3.2.6 解决方法 6 3.2.7 结论 6 3.3 基于DIV的网页布局-模版的核心 7 3.3.1 概述 7 3.3.2 简单、直观的DIV布局 7 3.3.3 DIV布局问题的终极解决方案 9 3.3.4 ...

    NodeDemos:节点演示

    遇到的问题: 1) 某些网页不让爬取 解决方法:设置合理的User-Agent,模仿浏览器行为 2)有的用户没有id,直接就是一个个性域名 解决方法:舍弃 3)抓取太频繁,被封号!服务器返回403 利用setInterval()函数,设置...

    jquery-modal:从 https 分叉

    相比之下,这个插件处理了我遇到的两种最常见的情况显示现有的 DOM 元素使用 AJAX 加载页面并使用尽可能少的 HTML 和 CSS 来实现。安装包括和jquery.modal.min.js脚本: [removed][removed][removed][removed]包括...

    老生常谈的跨域处理

    摘要:跨域问题,无论是面试还是平时的工作中,都会遇到,本文总结处理跨域问题的几种方法以及其原理,也让自己搞懂这方面的知识,走起。 什么是跨域 在JavaScript中,有一个很重要的安全性限制,被称为“Same-...

    +字形大小改变Lite「A+ FontSize Changer Lite」-crx插件

    或者,您可以使用弹出菜单中的按钮,这将更改文档和iframe中的文本大小。对于Chrome浏览器来说,这是一个奇怪的限制。限制此扩展版的Lite版本在离开页面时不会保存自定义文本大小,颜色和背景色,也​​不允许您更改...

    A + FontSize Changer Pro「A+ FontSize Changer Pro」-crx插件

    2018年3月21日-版本1.2.9-专业版和版本1.2.5-精简版-现在使用自定义颜色选择器而不是HTML 5颜色选择器,因为现在某些Windows用户遇到的错误与Mac OS用户相同具有HTML 5颜色选择器窗口打开和扩展弹出窗口关闭的功能。...

    php中http与https跨域共享session的解决方法

    遇到了HTTP、HTTPS协议下session共享解决cookie失效的问题,这里提供一个临时解决办法。 实现原理:把session id设置到本地的cookie。 如下: 复制代码 代码如下: $currentSessionID = session_id(); session_id($...

Global site tag (gtag.js) - Google Analytics