iframe实现局部刷新和回调--开篇

今天做项目遇到一个问题。就是提交表单的时候,验证用户名是否存在和验证码是否正确。

当验证码或者用户名存在的时候。在后台弹窗提示。可页面原本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" οnsubmit="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页面

View Code
 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" οnsubmit="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处理程序

View Code
 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>
View Code

 

添加回车事件

 <input οnkeypress="getKey(event)" >

 

function getKey(e)
{
var e = e || window.event;
if (e.keyCode == 13) {
$("#btnSearch").trigger("click"); //处罚按钮的click事件
}
}

 

转载于:https://www.cnblogs.com/nsky/archive/2012/12/21/2827300.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sjf调度算法_如何通过静态方法预测SJF调度中未来过程的突发时间?

sjf调度算法In SJF Scheduling, CPU is assigned to the process having the smallest burst time but it can not be implemented practically, because we dont know burst time of the arrived processes in advance. 在SJF Scheduling中 &#xff0c;将CPU分配给具有最短突…

Postgresql中的hybrid hash join(无状态机讲解)

hybrid hash join hybrid hash join是基于grace hash join 的优化。 在postgresql中的grace hash join 是这样做的&#xff1a;inner table太大不能一次性全部放到内存中&#xff0c;pg会把inner table 和outer table按照join的key分成多个分区&#xff0c;每个分区(有一个inn…

Web项目中获取SpringBean——在非Spring组件中获取SpringBean

最近在做项目的时候我发现一个问题&#xff1a;Spring的IOC容器不能在Web中被引用(或者说不能被任意地引用)。我们在配置文件中让Spring自动装配&#xff0c;但并没有留住ApplicationContext的实例。我们如果希望在我们的项目中任何位置都能拿到同一个ApplicationContext来获取…

postgresql对于HashJoin算法的Data skew优化与MCV处理

Data skew 很好理解&#xff0c;即数据倾斜。现实中的数据很多都不是正态分布的&#xff0c;譬如城市人口&#xff0c;东部沿海一个市的人口与西部地区一个市地区的人口相比&#xff0c;东部城市人口会多好几倍。 postgresql的skew的优化核心思想是"避免磁盘IO"。 优…

JavaScript | 创建对象并通过JavaScript函数在表中显示其内容

In this example, we created an object named employee with id, name, gender, city, and salary and assigned and displaying the values in the table using JavaScript function. 在此示例中&#xff0c;我们创建了一个名为employee的对象&#xff0c;其对象为id &#x…

基于socket的简单文件传输系统

【实验目的及要求】 在 Uinx/Linux/Windows 环境下通过 socket 方式实现一个基于 Client/Server 文件传输程序。 【实验原理和步骤】 1. 确定传输模式:通过 socket 方式实现一个基于 Client/Server 或 P2P 模式的文件传输程序。 2. 如果选择的是 Client/Server 模式的文件传输…

Postgresql的HashJoin状态机流程图整理

状态机 可以放大观看。 HashJoinState Hash Join运行期状态结构体 typedef struct HashJoinState {JoinState js; /* 基类;its first field is NodeTag */ExprState *hashclauses;//hash连接条件List *hj_OuterHashKeys; /* 外表条件链表;list of …

JqueryUI入门

Jquery UI 是一套开源免费的、基于Jquery的插件&#xff0c;在这里记录下Jquery UI 的初步使用。 第一、下载安装 下载Jquery,官网&#xff1a;http://jquery.com;  下载Jquery UI&#xff0c;官网&#xff1a;http://jqueryui.com/ Jquery的部署就不说了&#xff0c;说下Jqu…

IO多路复用的三种机制Select,Poll,Epoll

IO多路复用的本质是通过系统内核缓冲IO数据让单个进程可以监视多个文件描述符&#xff0c;一旦某个进程描述符就绪(读/写就绪)&#xff0c;就能够通知程序进行相应的读写操作。 select poll epoll都是Linux提供的IO复用方式&#xff0c;它们本质上都是同步IO&#xff0c;因为它…

qt中按钮贴图

一.QT之QPushButton按钮贴图 二.QT之QToolButton按钮贴图 一.QT之QPushButton按钮贴图具体操作流程 1. Qt Designer中拖入一Tool Button 2. 选择图标的图片放入工程目录下&#xff0c;如放在Resources内 3. 双击工程的Resource Files下的qrc文件&#xff0c;如图 4. 在弹出的窗…

Android Activity类讲解(一)

--by CY[kotomifigmail.com] &#xff11;&#xff0e;protected void onCreate(Bundle savedInstanceState) { throw new RuntimeException("Stub!");   } 当创建一个Activity时&#xff0c;系统会自动调用onCreate方法来完成创建工作&#xff0e;该创建工作包括布…

Mysql的undo、redo、bin log分析

目录关于undo log关于redolog关于binlog一个事务的提交流程undo log :记录数据被修改之前的样子 redo log&#xff1a;记录数据被修改之后的样子 bin log&#xff1a;记录整个操作。 关于undo log 关于undo log&#xff1a; 在执行一条涉及数据变更的sql时&#xff0c;在数据…

JPA概要

本文最新版已更新至&#xff1a;http://thinkinside.tk/2012/12/30/JPA.html JPA定义了Java ORM及实体操作API的标准。本文摘录了JPA的一些关键信息以备查阅。 如果有hibernate的基础&#xff0c;通过本文也可以快速掌握JPA的基本概念及使用。 Table of Contents 1 JPA概述2 实…

如何配置能让fiddler抓去https的请求?

1、打开fiddler&#xff0c;>>Tools>>Fiddler Options&#xff0c; 打开如图所示的HTTPS配置项&#xff1a;点击Export Rppt Certifica to Desktop :桌面上多了一个证书&#xff1a;下面就是将证书导入&#xff1a;点击开始-运行&#xff0c;输入&#xff1a;mmc,…

【闲聊】Baidu Map,excellent !!!Diaoyv island is China 's

【钓鱼岛】钓鱼岛是中国的&#xff01;Diaoyu Islands are Chinas! 釣魚島は中国のアール! ————————————youngLaker转载于:https://www.cnblogs.com/younglaker/archive/2012/12/31/2840190.html

08:vigenère密码_密码技术:Vigenére密码,Playfair密码,Hill密码

08:vigenre密码1)Vigenre密码 (1) Vigenre Cipher) This technique is an example of Polyalphabetic Substitution technique which uses 26 Caesar ciphers make up the mono-alphabetic substitution rules which follow a count shifting mechanism from 0 to 25. That is,…

node oauth2验证_如何设置和使用护照OAuth Facebook身份验证(第2部分)| Node.js

node oauth2验证In my last article (How to set up and use passport OAuth Facebook Authentication (Section 1) | Node.js), we looked at another form of authentication called the OAuth authentication which involves sign in or signup using social media. 在我的上…

东哥读书小记 之 《一个广告人的自白》

掰着指头一算&#xff0c;端午假期确实完成不少事情&#xff0c;过的太尼玛充实鸟&#xff1a;去健身房2小时&#xff0c;且老夫的平板支撑终于能坚持超过1分钟&#xff0c;普大喜奔有木有&#xff1b;给合租的室友买蛋糕过了个生日&#xff1b;去 去哪儿 参加W3ctech的技术交流…

Redis的文件事件与时间事件处理

目录文件事件处理事件类型客户端和服务端的通信过程时间事件处理执行器执行周期性事件作用事件的调度与执行文件事件处理 Redis基于Reactor模式开发了文件事件处理器。文件事件处理器以单线程方式运行&#xff0c;通过IO多路复用程序监听多个套接字&#xff0c;实现了高性能网…

Linux SPI框架

水平有限&#xff0c;描述不当之处还请指出&#xff0c;转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7733476 Linux的SPI子系统采用主机驱动和外设驱动分离的思想&#xff0c;首先主机SPI控制器是一种平台设备&#xff0c;因此它以platform的方式注册进内…