iframe实现局部刷新和回调--开篇
2012-12-21 00:22 糯米粥 阅读(3058) 评论(2) 编辑 收藏 举报今天做项目遇到一个问题。就是提交表单的时候,验证用户名是否存在和验证码是否正确。
当验证码或者用户名存在的时候。在后台弹窗提示。可页面原本file里面符合要求的值刷新没了。用户体验不好。因为用ifream刷新技术已不是什么新鲜技术。所以网上有大把的资料可参考。只是因为本人是初次接触。所以记下自己的知识点。当成长经历。对于入门的我们先来全名了解下。
什么是iframe
Iframe是Inline Frame的缩写,称为内联框架(即行内框架)。看着很眼熟吧,对了,它有个近亲可是大名鼎鼎的Frame(框架)标记。使用框架有两个缺点:占用了宝贵的显示面积、不利于保持网站整体风格。而使用Iframe则可以避免此类缺点。它可以在网页的局部插入另一个文件,更新时只要更改所插入的文件即可
Iframe标记格式使用:
<iframe src="http://www.cnblogs.com" width=830 heitht=999 scrolling="yes"></iframe>
src:文件的路径,既可是HTML文件,也可以是文本、ASP等;
width、height:“画中画“区域的宽与高;
scrolling:当src的指定的HTML文件在指定的区域不显不完时,滚动选项,如果设置为NO,则不出现滚动条;如为Auto:则自动出现滚动条;如为Yes,则显示;
FrameBorder:区域边框的宽度,为了让“画中画“与邻近的内容相融合,常设置为0。
iframe框架与form表单实例
我们经常做的是在页面放一个隐藏的iframe,然后把form的target属性指向iframe的name属性
<!--这里设置target="ajaxifr",这样表单就提交到iframe里面了,和平时未设置target属性时默认提交到当前页面 -->
<iframe name="ajaxifr" runat="server" style="display:block;"></iframe>
<form method="post" runat ="server" enctype="multipart/form-data" action="check.ashx" target="ajaxifr" onsubmit="return check()" >
选择文件:<input type="file" name="upfile" /><br />
<input type="submit" runat="server" value="提交" />
</form>
现在action的页面是子窗体,即check.ashx,from当前页面为父页面。
在父窗体中,Iframe即子窗体是document对象的一个子对象,可以直接在脚本中访问子窗体中的对象。
在子窗体中我们可以通过其parent即父(双亲)对象来访问父窗口中的对象。
function msg() { alert("回调"); } //通过parent访问父页面的函数。实现回调 Response.Write("<script>parent.msg()</script>"); //如果不想回调,只想弹窗,可以加parent也可以不加(因为弹窗会在顶层显示),其他的同理 Response.Write("<script>parent.alert('提示')</script>"); //重定向 Response.Write("<script>parent.window.location.href='http://www.cnblogs.com'</script>"); //记住:这里如果不用parent(主动权交给父页面),那就会在iframe中打开网页,
//那当我们回调显示的时候。在前台就永远都不会看到跳转的页面。除非你要求在iframe中打开
最后附一个完整的实例。仅仅是图片上传并回调显示图片信息
$("#id", window.parent.document).val("cc");
var btn = ifmMain.window.document.getElementById("id");
index.aspx页面
1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="tlxRegist.Test.WebForm2" %> 2 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 4 <html xmlns="http://www.w3.org/1999/xhtml"> 5 <head runat="server"> 6 <title></title> 7 <script src="../Scripts/jquery-1.3.2.min.js" type="text/javascript"></script> 8 </head> 9 <body> 10 <script type="text/javascript"> 11 function UpdateMsg(des, filename) {//此函数用来提供给提交到的页面如upload.ashx输出js的回调,更新当前页面的信息 12 if (filename == '') { alert('未上传文件!'); return false; } 13 document.getElementById('ajaxMsg').innerHTML = '你在表单中输入的“文件描述”为:' + des + '<br/>' 14 + '上传的图片为:<a href="uploads/' + filename + '" target="_blank">' + filename + '</a>'; 15 } 16 17 function check(f) { 18 if (f.des.value == '') { 19 alert('请输入文件描述!'); f.des.focus(); return false; 20 } 21 if (f.upfile.value == '') { 22 alert('请选择文件!'); f.upfile.focus(); return false; 23 } 24 } 25 </script> 26 <!--隐藏的iframe来接受表单提交的信息--> 27 <iframe name="ajaxifr" style="display:none;"></iframe> 28 <!--这里设置target="ajaxifr",这样表单就提交到iframe里面了,和平时未设置target属性时默认提交到当前页面--> 29 <!--注意一点的是使用iframe时在提交到的页面可以直接输出js来操作父页面的信息,一般的ajax提交文本信息时你需要返回信息,如果是js信息你还得eval下--> 30 <form method="post" enctype="multipart/form-data" action="../upload.ashx" target="ajaxifr" onsubmit="return check(this)"> 31 文件描述:<input type="text" name="des" /><br /> 32 选择文件:<input type="file" name="upfile" /><br /> 33 <input type="submit" value="提交" /> 34 </form> 35 <!--放入此div用来实现上传的结果--> 36 <div id="ajaxMsg"> 37 </div> 38 39 </body> 40 </html>
upload.ashx处理程序
1 <%@ WebHandler Language="C#" Class="upload" %> 2 3 using System; 4 using System.Web; 5 6 public class upload : IHttpHandler { 7 private string Js(string v) 8 {//此函数进行js的转义替换的,防止字符串中输入了'后造成回调输出的js中字符串不闭合 9 if (v == null) return ""; 10 return v.Replace("'", @"\'"); 11 } 12 //下面就是一个简单的示例,保存上传的文件,如果要验证上传的后缀名,得自己写,还有写数据库什么的 13 public void ProcessRequest(HttpContext context) 14 { 15 HttpRequest Request = context.Request; 16 HttpResponse Response = context.Response; 17 HttpServerUtility Server = context.Server; 18 //指定输出头和编码 19 Response.ContentType = "text/html"; 20 Response.Charset = "utf-8"; 21 22 HttpPostedFile f = Request.Files["upfile"];//获取上传的文件 23 string des = Request.Form["des"]//获取描述 24 , newFileName = Guid.NewGuid().ToString();//使用guid生成新文件名 25 26 if (f.FileName == "")//未上传文件 27 Response.Write("<script>parent.UpdateMsg('','');</script>");//输出js,使用parent对象得到父页的引用 28 else 29 { //保存文件 30 newFileName += System.IO.Path.GetExtension(f.FileName);//注意加上扩展名 31 try 32 { 33 f.SaveAs(Server.MapPath("~/uploads/" + newFileName));//如果要保存到其他地方,注意修改这里 34 35 //调用父过程更新内容,注意要对des变量进行js转义替换,繁殖字符串不闭合提示错误 36 Response.Write("<script>parent.UpdateMsg('" + Js(des) + "','" + newFileName + "')</script>"); 37 } 38 catch 39 { 40 Response.Write("<script>alert('保存文件失败!\\n请检查文件夹是否有写入权限!');</script>");//如果保存失败,输出js提示保存失败 41 } 42 43 } 44 } 45 46 public bool IsReusable 47 { 48 get 49 { 50 return false; 51 } 52 } 53 54 }
IE8中IFrame高度自适应
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="Iframe.Index" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script type="text/javascript"> //重新设置编辑区域高度 function setHeight() { var h = document.documentElement.clientHeight - 90; var w = document.documentElement.clientWidth - 23; if (h > 0) { document.getElementById("tabMain").style.height = h.toString() + "px"; } var ifmA = document.getElementById("ifmA"); var ifmB = document.getElementById("ifmB"); if (w > 0) { ifmA.style.width = w.toString() + "px"; } if (w > 0) { ifmB.parentNode.parentNode.style.width = w.toString() + "px"; } if (ifmA.readyState == "complete") { var ih = ifmA.contentWindow.document.body.offsetHeight; if (ih > 0) { ifmA.style.height = (ih + 5).toString() + "px"; } } if (ifmB.readyState == "complete") { var oh = ifmB.contentWindow.document.body.offsetHeight; if (oh > 0) { ifmB.style.height = (oh + 5).toString() + "px"; } } } function PageLoad() { var ifmA = document.getElementById("ifmA"); var ifmB = document.getElementById("ifmB"); setIFrameResize(ifmA, setHeight); setIFrameResize(ifmB, setHeight); } function setIFrameResize(iframe, fun) { iframe.parentNode.onresize = setHeight; iframe.onreadystatechange = function (ev) { if (iframe.readyState == "complete") { var ic = iframe.contentWindow; ic.attachEvent('onload', fun); ic.attachEvent('onresize', fun); } } } window.onload = PageLoad; window.attachEvent("onload", setHeight); window.attachEvent("onresize", setHeight); </script> </head> <body> <form id="form1" runat="server"> <div id="tabMain"> <div style="background-color: gray;">A页面</div> <div> <iframe id="ifmA" name="ifmA" width="100%" frameborder="0" marginwidth="0" scrolling="auto" src="a.aspx"></iframe> </div> <div style="background-color: gray;">B页面</div> <div> <iframe id="ifmB" name="ifmB" width="100%" frameborder="0" marginwidth="0" scrolling="auto" src="b.aspx"></iframe> </div> </div> </form> </body> </html>
添加回车事件
<input onkeypress="getKey(event)" >
function getKey(e)
{
var e = e || window.event;
if (e.keyCode == 13) {
$("#btnSearch").trigger("click"); //处罚按钮的click事件
}
}