`
837062099
  • 浏览: 112484 次
  • 性别: 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模拟Jquery.Ajax

    通过深入理解这些知识点,并结合提供的"Iframe模拟Ajax-经典"压缩包中的代码示例和文档,你可以更有效地掌握如何在面临同源策略限制时,使用Iframe来模拟Ajax请求,实现跨域数据交互。这将有助于你在开发过程中解决...

    easyui iframe 页面重复加载的问题

    在使用easyui框架开发Web应用时,特别是在使用tab布局的时候,开发者可能会遇到页面内容被放置在iframe中时,页面多次加载的问题。这种情况尤其会在使用easyui的tab布局时发生,因为easyui会默认加载所有tab的内容,...

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

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

    漂亮div展示图片,ajax,iframe,html内容highslide-3.3.22.zip

    - `ajax.htm`:这个文件可能是一个示例,展示了如何使用Highslide JS加载并通过Ajax技术动态显示网页内容,这样可以在不刷新整个页面的情况下更新内容,提高用户体验。 3. **Iframe支持**: - `example-iframe....

    IE7 Ajax跨域问题

    标题 "IE7 Ajax跨域问题" 涉及到的是在使用Ajax技术在Internet Explorer 7(IE7)浏览器中处理跨域请求时遇到的挑战。在Web开发中,Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下与服务器...

    js实现iframe自适应高度

    在网页开发中,`iframe`(Inline Frame)是一种嵌入其他网页的标签,常用于页面模块化、...然而,实际应用中可能还会遇到其他复杂情况,如延迟加载、动态插入的`iframe`等,这时可能需要结合更多的技巧和策略进行优化。

    iframe实时高度检测

    如果`iframe`加载的页面与父页面不在同一个域名下,会遇到跨域问题。这时,`iframe`内的页面需要设置`window.contentWindow.postMessage`,并且父页面需要在`window.addEventListener`的事件处理函数中添加对`origin...

    AJAX培训 - 第一讲:AJAX基础

    在使用AJAX的过程中可能会遇到各种错误情况,需要进行适当的错误处理。 - **常见错误类型**: - 请求初始化失败:可能是由于URL非法或跨域问题。 - 未接收到正确的HTTP头部:可能是因为服务器未响应或请求的资源不...

    jQuery冻结表头-嵌套iframe页面

    1. **跨域问题**:如果主页面和子页面不在同一个域名下,可能会遇到跨域限制。为了解决这个问题,可能需要在服务器端配置CORS(跨源资源共享)或者使用JSONP(JSON with Padding)进行跨域通信。 2. **iframe通信**...

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

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

    Ajax请求时无法重定向的问题解决代码详解

    根据给定的文件信息,我们可以详细地了解Ajax请求时遇到的重定向问题以及解决这一问题的代码实现。首先,我们需要明确Ajax请求的特点,以及为何它无法直接处理服务器的重定向响应。接下来,将详细介绍后端代码和前端...

    AJAX技术和原理分析

    4. **异常处理困难**:使用某些AJAX框架时可能会遇到异常处理问题。 #### 六、结论 尽管AJAX带来了一系列的优势,但也存在一些固有的局限性。开发人员在选择使用AJAX时应综合考虑项目的具体需求和技术挑战,权衡...

    什么是内联框架(iframe)?.pdf

    为了克服这些问题,现代Web开发中出现了替代iframe的技术,如AJAX和动态HTML,它们能够创建更流畅、更交互的用户体验,而不需要使用iframe。同时,对于需要在页面中集成外部内容的需求,微前端架构提供了一种更现代...

    Ajax编程.pdf

    - **.NET**:需要安装.NET运行时环境,可能会遇到部署问题。 - **手持设备浏览器**:对Ajax的支持有限。 #### 七、总结 **Ajax**作为一种重要的前端技术,不仅提高了用户的体验,还极大地提升了Web应用的性能。...

    iframe式ajax调用示例代码

    这时,“iframe式Ajax调用”作为一种替代方案,能够有效地解决这些问题。 #### 二、iframe式Ajax调用原理 **1. 原理介绍** - **iframe(Inline Frame)**: 是HTML中的一个标签,用于在当前文档中嵌入另一个HTML...

    JS iFrame加载慢怎么解决

    在探讨JavaScript中iFrame加载缓慢的问题时,我们会遇到一些常见的性能瓶颈和解决方案。首先,理解iFrame加载的工作机制对于找到合适的解决方案至关重要。iFrame是HTML中的一个元素,它能够将另一个HTML文档嵌入到...

    jQuery-1.8.3(&2.1.4).min.js&jquery;.fileupload&jquery;.iframe-transport

    由于浏览器的安全策略,某些情况下普通的Ajax上传可能无法工作,这时Iframe Transport通过创建一个隐藏的iframe来模拟表单提交,从而实现跨域和大文件的无刷新上传。这种技术对于那些不支持FormData或XMLHttpRequest...

    AJAX .docx

    - **jQuery**:这是一个轻量级的库,具有强大的DOM操作、CSS选择器支持以及链式语法,使其在跨浏览器环境中易于使用和部署。 ### AJAX常见问题 1. **JS脚本缓存问题**:在开发过程中,可能会遇到修改后的代码无法...

    收集记录一些使用Javascript,JQuery时遇到的问题

    这篇博文“收集记录一些使用Javascript,JQuery时遇到的问题”旨在汇总这些常见问题,提供解决方案,并帮助读者更好地理解和应用这两种强大的脚本语言。 JavaScript作为Web开发的核心技术之一,是所有浏览器都支持...

Global site tag (gtag.js) - Google Analytics