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

当验证码或者用户名存在的时候。在后台弹窗提示。可页面原本file里面符合要求的值刷新没了。用户体验不好。因为用ifream刷新技术已不是什 么新鲜技术。所以网上有大把的资料可参考。只是因为本人是初次接触。所以记下自己的知识点。当成长经历。对于入门的我们先来全名了解下。

什么是iframe

Iframe是Inline  Frame的缩写,称为内联框架(即行内框架)。看着很眼熟吧,对了,它有个近亲可是大名鼎鼎的Frame(框架)标记。使用框架有两个缺点:占用了宝贵 的显示面积、不利于保持网站整体风格。而使用Iframe则可以避免此类缺点。它可以在网页的局部插入另一个文件,更新时只要更改所插入的文件即可

Iframe标记格式使用:

  <iframe src="http://www.cnblogs.com" width=921 heitht=248></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中打开

最后附一个完整的实例。图片上传并回调显示。网上整理

//前端   



 <script type="text/javascript">

        function UpdateMsg(des, filename) {//此函数用来提供给提交到的页面如upload.ashx输出js的回调,更新当前页面的信息

            if (filename == '') { alert('未上传文件!'); return false; }

            document.getElementById('ajaxMsg').innerHTML = '你在表单中输入的“文件描述”为:' + des + '<br/>'

      + '上传的图片为:<a href="uploads/' + filename + '" target="_blank">' + filename + '</a>';

        }

    </script>

    

    <!--隐藏的iframe来接受表单提交的信息-->

    <iframe name="ajaxifr" runat="server" style="display:block;"></iframe>

    <!--这里设置target="ajaxifr",这样表单就提交到iframe里面了,和平时未设置target属性时默认提交到当前页面     ../upload.ashx--> 

    <!--注意一点的是使用iframe时在提交到的页面可以直接输出js来操作父页面的信息,一般的ajax提交文本信息时你需要返回信息,如果是js信息你还得eval下-->

    <form method="post" runat ="server" enctype="multipart/form-data" action="upload.ashx" target="ajaxifr" onsubmit="return UpdateMsg(this)" >

    文件描述:<input type="text" name="des" /><br />

    选择文件:<input type="file" name="upfile" /><br />

   <input type="submit" runat="server" value="提交" />

    </form>

    <!--放入此div用来实现上传的结果-->

    <div id="ajaxMsg">

    </div>



//后端 upload.ashx

<%@ WebHandler Language="C#" Class="upload" %>



using System;

using System.Web;



public class upload : IHttpHandler {

    private string Js(string v) {//此函数进行js的转义替换的,防止字符串中输入了'后造成回调输出的js中字符串不闭合

        if (v == null) return "";

        return v.Replace("'", @"\'");

    }

    //下面就是一个简单的示例,保存上传的文件,如果要验证上传的后缀名,得自己写,还有写数据库什么的

    public void ProcessRequest (HttpContext context) {

        HttpRequest Request = context.Request;

        HttpResponse Response = context.Response;

        HttpServerUtility Server = context.Server;

        //指定输出头和编码

        Response.ContentType = "text/html";

        Response.Charset = "utf-8";

        

        HttpPostedFile f = Request.Files["upfile"];//获取上传的文件

        string des = Request.Form["des"]//获取描述

            ,newFileName=Guid.NewGuid().ToString();//使用guid生成新文件名



        if (f.FileName == "")//未上传文件

            Response.Write("<script>parent.UpdateMsg('','');</script>");//输出js,使用parent对象得到父页的引用

        else { //保存文件

            newFileName += System.IO.Path.GetExtension(f.FileName);//注意加上扩展名

            try {

                f.SaveAs(Server.MapPath("~/uploads/" + newFileName));//如果要保存到其他地方,注意修改这里



                //调用父过程更新内容,注意要对des变量进行js转义替换,防止字符串不闭合提示错误

                Response.Write("<script>parent.UpdateMsg('" +Js(des)+ "','" + newFileName + "')</script>");

            }

            catch {

                Response.Write("<script>alert('保存文件失败!\\n请检查文件夹是否有写入权限!');</script>");//如果保存失败,输出js提示保存失败

            }

            

        }

    }

 

    public bool IsReusable {

        get {

            return false;

        }

    }



}


iframe实现局部刷新和回调(转)的更多相关文章

  1. iframe之局部刷新

      例如: <iframe src="1.htm" name="ifrmname" id="ifrmid"></ifram ...

  2. iframe局部刷新的二种实现方法

    需求描述: 当页面有一部分是不变的或整个页面的图片很多时,可以考虑使用局部刷新,以提高整体的下载速度与用户体验.   1,iframe实现局部刷新的方法一 复制代码代码示例: <script t ...

  3. (局部刷新)jquery.ajax提交并实现单个div刷新

    web开发中我们经常会遇到局部刷新页面的需求,以前我经常使用ajax和iframe实现局部刷新,后来做政府的项目,对页面的样式要求比较多,发现使用iframe控制样式什么的很麻烦,所以就采用了新的办法 ...

  4. js控制iframe的刷新(页面局部刷新)

    今天遇到个问题,后台会员审核之后,页面内的会员审核状态要及时改变,但又不能指望用户手动刷新(用户体验很不好) 如果审核页面和显示审核状态时同在一个html页面的话,那么直接用js改变div内部的文本就 ...

  5. 使用ajax与iframe嵌套实现页面局部刷新

    使用ajax与iframe嵌套实现页面局部刷新.该javascript代码仅供参考,需按自己需要修改.​1. [代码]javascript代码 function cj_start(depname,gr ...

  6. updatepanel用法之triggers(局部刷新,全部刷新)使用示例

    asyncpostbacktrigger(异步回调触发器):局部刷新,只刷新updatepanel内部的内容postbacktrigger(普通回调触发器):全部刷新 <asp:ScriptMa ...

  7. 使用jQuery验证用户名是否存在,达到局部刷新的效果

    <%@ page pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  8. 在.NET MVC下不用iframe实现局部加载html

    最近在做个后台系统,之前都是用iframe来实现加载内容,左侧菜单不刷新.但一直不喜欢这种方法,有许多弊端.今天自己在网上查找了一番后找到了比较好的替代方案: 一.利用html的锚点标记来实现无刷新页 ...

  9. 整体刷新和局部刷新frameset窗口(转)

    在项目中,经常会遇到页面分割,最常见的系统或网站的主界面.主页面分为,上面系统简介.下面作者简介.左边系统功能菜单.右边则是菜单真正展示的界面.               遇到这种这种分割页面,大家 ...

随机推荐

  1. RAMCloud:内存云存储的内存分配机制

    现在全闪存阵列已经见怪不怪了,EMC的XtremIO,还有VNX-F(Rockies),IBM FlashSystem.全闪存真正为效率而生,重新定义存储速度.凭借极致性能,高可用性,为您极大提高企业 ...

  2. 【一天一道LeetCode】#108. Convert Sorted Array to Binary Search Tree

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  3. ROS_Kinetic_17 使用V-Rep3.3.1(vrep_ros_bridge)

    ROS_Kinetic_17 使用V-Rep3.3.1(vrep_ros_bridge) https://github.com/lagadic/vrep_ros_bridge v-rep也有官网也有教 ...

  4. 如何回滚请求<复制系统初始的数据>所处理的数据

    一.    问题提出 请求名称:复制系统初始的数据 参数:空 问题: 今天早上财务实施人员新配置了一个OU,然后在跑复制系统初始的数据报表的时候,不小心,不输入参数就直接跑. 报表先是报错. 接下来的 ...

  5. Java:将字符串中的数字转换成整型

    在C语言中,将字符串中的数字转换为整型的方法是是利用atoi这个函数.在Java中,我们可以利用parseInt方法来实现,具体代码如下: public class HelloWorld { publ ...

  6. Socket编程实践(8) --Select-I/O复用

    五种I/O模型介绍 (1)阻塞I/O[默认] 当上层应用App调用recv系统调用时,如果对等方没有发送数据(Linux内核缓冲区中没有数据),上层应用Application1将阻塞;当对等方发送了数 ...

  7. javascript综合小案例,校验用户注册信息提交

    完成这个综合小案例,对于html.css.javascript的大部分内容复习快结束了. 这里做一个小案例--要实现的功能,以一张图片的形式给出: 首先,写出提交数据之后进入的页面代码: <!D ...

  8. Python+Visual Studio

    一直在找一个比较好的Python IDE,无奈找来找去都不太好用,由于经常用Visual Studio,所以很希望找到一个能够在VS中的Python扩展.今天发现了一个很给力的VS扩展,可以在VS中方 ...

  9. JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块

    JAVA之旅(四)--面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块 加油吧,节奏得快点了 1.概述 上篇幅也是讲了这点,这篇幅就着重的讲一下思想和案例 就拿买 ...

  10. python 去掉 pyc

    python 去掉 .pyc 在开发的机器上(Ubuntu),python自动生成的pyc文件太影响心情,把下面的语句添加到 /etc/profile中: # do not produce .pyc ...