zoukankan      html  css  js  c++  java
  • 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" 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页面

    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" 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处理程序

    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 onkeypress="getKey(event)" >

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

    作者: nsky
    出处: http://nsky.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,共同学习;共同进步;但不能乱搞!
  • 相关阅读:
    .net正在终止线程异常
    js判断客户浏览器类型,版本
    C#中ToString格式大全
    WPF TextBox 搜索框 自定义
    C#:获取设备电量相关信息
    C#中的委托与事件并存的理由
    WPF中的Pack URI
    SQLServer中的数据库备份和还原
    使用Aspose.Cells读取Excel
    SQLServer存储过程事务用法
  • 原文地址:https://www.cnblogs.com/nsky/p/2827300.html
Copyright © 2011-2022 走看看