iframe+ajaxSubmit結合--續篇(判斷圖片(文件)大小,上傳圖片,驗證碼刷新)


  人們似乎慢慢遺忘了iframe。畢竟在ajax未誕生前。都是用iframe來實現無刷新的效果。當請教iframe實現無刷新知識時。他們說從來沒用過。iframe是什么?。無奈。只有自己摸索,畢竟我屬入門級別。下面的方法從效率上好不好。我也說不清。

已有的用戶注冊表單,現優化實現如下功能

  • 用戶選擇圖片及時判斷圖片大小,不符合的話清空value
  • 點提交按鈕判斷驗證碼是否正確。頁面不能刷新,且要保證符合要求的file的vlaue存在。因為只要頁面不刷新。value的值就會存在

思路:

  • 因為file是Readonly,想清空value。只能用新的file替換之前的file
  • 想頁面不刷新。首選當然是ajax請求,給每個file注冊onchang事件

我們可以動態給每個file注冊onchang事件,我這里用bind代替live。它的好處是。在頁面加載完成后添加的file也會被注冊onchang事件。因為我這里允許用戶動態添加file。

    $(function () {
        $("[type=file]").live("change", function () {
            //執行代碼
        })
    })

 

但動態注冊的onchang事件觸發的條件:1:文本框值發生改變 、2:文本框失去焦點 

所以這里達不到及時驗證。體驗不好,故而給頁面已有的file加上onchang事件。動態添加的file也同時添加onchang事件。

如:動態添加的file,給fileEven()函數加個參數,當觸發時把對象傳過去。可以獲取當前file的屬性

 var html = '<dl class="clear" ><dt>iframe+ajaxSubmit圖片上傳:</dt><dd><input id="file" name="FilePath" onchange="fileEven(this);" type="file"/></dd></dl>';  

 

既然是在后台判斷大小。當然就用不了$.get。$.post提交。難道你想在把value傳到后台。在后台fileInfo讀取文件嗎?額,當時也這么想過。!!!,那我們必須把表單提交,后台HttpPostedFile接收。那么選擇form插件提交表單:jquery.form.js,

我們准備一個iframe。表單提交給iframe。會刷新iframe。不會刷新頁面。方能保存file中的value,把表單提交到iframe很簡單。上篇博文也介紹了

這里准備一個iframe。設置為隱藏

<!--隱藏的iframe來接受表單提交的信息 頁面會在iframe中刷新。不會刷新from 達到保存表單中文本框的值-->
<iframe id="Iframe1" name="ajaxifr" style="display: none;"></iframe>

 

把表單的target屬性指向iframe的name ,表單的enctype屬性記得設置為:multipart/form-data  。我這里是沒設置action。因為是提交給當前頁面

 

<form id="form1" runat="server" method="post" enctype="multipart/form-data" target="ajaxifr" >

 

 

提供一張表單屬性圖

                                            

AjaxSubmit提交表單

View Code
//每個file的onchang事件 ,這里當文件無效,不合法等都替用一個新的file替換之前的file。用來達到清空value的目的
function fileEven(type) {  //用戶選取圖片時。接收當前對象
    var file = $(type);
    file.attr("name", "fileSrc");    //給當前file取個唯一name。在后台統一接收
    if (CheckFilePath(file)) {      //CheckFilePath(file)是驗證圖片格式的函數。簡單的一個正則表達式
        $("#form1").ajaxSubmit({    //ajaxSubmit提交表單,這里要區分ajaxForm
            success: function (data) {
                if (data == "no") {
                    alert("不能上傳大於300Kb的圖片!");  //默認是4M。所以記得在web.config配置上限大小
                    //file的id是唯一標識。所有我采用時間的毫秒。如果你怕重復。可以選擇number累加
                    file.parent().html("<input type='file' style='width: 259px' id='file" + new Date().getMilliseconds() + "' name='file' onchange='fileEven(this)'/>");
                    return;
                } else if (data == "null") {
                    alert("圖片無效!");
                    file.parent().html("<input type='file' style='width: 259px' id='file" + new Date().getMilliseconds() + "'   name='file' onchange='fileEven(this)'/>");
                    return;
                }
                file.attr("name", "" + new Date().getMilliseconds() + "");  //記住:被判斷過的file其name都是fileSrc。這里得改掉。避免重復。用毫秒數
            }
        });
    }
    else {  //否則文件格式無效
        alert('圖片格式無效,僅支持\r\njpeg、jpg、bmp、gif 圖片!');
        file.parent().html("<input id='file" + new Date().getMilliseconds() + "' style='width: 259px' type='file' name='file' onchange='fileEven(this)'/>");
    }

 

簡單區分下JQuery中的AjaxForm和AjaxSubmit。

  AjaxForm
    ajaxForm不能提交表單。在document的ready函數中,使用ajaxForm來為AJAX提交表單進行准備。提交動作必須由submit開始

<html> 
<head>
<script src="Scripts/jquery.js"></script> 
<script src="Scripts/jquery.form.js"></script> 

<script> 
// DOM加載后初始化  
 $(document).ready(function() {
 //  綁定"myForm”,並提供一個簡單的回調函數 
    $('#myForm').ajaxForm(function() { 
     alert("我不提交表單,我只是為后續提交表單做准備!"); 
       }); 
     }); 
 </script> 
</head> 

 

  AjaxSubmit
    馬上由AJAX來提交表單。你可以在任何情況下進行該項提交。

 

在web.config配置文件上限

<!--設置最大上傳文件,單位KB、此處設置的為25M-->
     <httpRuntime maxRequestLength="25600" 
     useFullyQualifiedRedirectUrl="true"
     executionTimeout="6000"
     minFreeThreads="8"
     minLocalRequestFreeThreads="4"
     appRequestQueueLimit="100"
     enableVersionHeader="true"
     />

 

提交。在后台接收並判斷

//判斷圖片的大小
 string msg = string.Empty;
 HttpPostedFile file = Request.Files["fileSrc"];

 int bytes = file.ContentLength;  //獲取圖片字節 單位 B
 if (bytes == 0)
 msg = "null";   //文件無效
 else if (bytes > 1024 * 1024 * 4)  //
 msg = "no";  //圖片不能大於4M  
 Response.Write(msg);
 Response.End(); //停止該頁的執行

 

點擊注冊按鈕提交注冊信息。並完成注冊

<asp:Button ID="imgBtnReg" runat="server" onfocus="this.blur()" OnClientClick="return chk_reg();" OnClick="imgBtnReg_Click" Text="確認提交"/>

 

后台判斷驗證碼是否正確。錯誤。彈提示框。並刷新驗證碼

當刷新驗證碼時。有兩點要注意

  1、因為這里是提交到iframe。所以刷新是調用父頁面的函數。所有要加parent。

  2、開頭說了。頁面不是沒刷新。而是在iframe刷新。既然有刷新,驗證碼也會刷新。驗證碼的值是保存在服務端的session中。但剛剛驗證碼錯誤的時候。你也刷新了一次。那一共就是兩次。

    因為是頁面先刷新(也就是我說的父頁面)parent.RefreshCode(),然后驗證碼圖片被顯示到頁面呈現在用戶前。驗證碼也保存在session中,繼而iframe跟着刷新。替換了之前躲在session中的值。這樣用戶看到的驗證碼。

    跟藏在session中的值永遠不相等。可把我折騰了壞了。用return退出達不到目的,最后在刷新驗證碼后。Response.End();讓頁面中斷。iframe也就不會刷新。問題得到了解決。

Response.Write("<script>alert('驗證碼輸入錯誤')</script>");  //彈出提示框,提示驗證碼錯誤
Response.Write("<script>parent.RefreshCode()</script>");  //驗證碼輸入錯誤。回調。更新驗證碼
Response.End();  //這句話就阻止了iframe繼續刷新。頁面終止

 

當你注冊完成后需要跳轉頁面。記得parent

//因為是把form提交到iframe。此頁面為子頁面,所有這里需用parent。在父窗口打開鏈接
  
Response.Write("<script>parent.window.location.href('http://www.cnblogs.com')</script>"); 

//但這只支持IE中。FF Ch中得這樣,推薦這樣寫  有很多形式在IE中可行。不一定在其他瀏覽器中也能成功。這里沒有一一列出。

Response.Write("<script>parent.window.location.href='http://www.cnblogs.com'</script>");

 擴展:html { overflow-x:hidden; }使iframe不顯示下面的滾動條 

資源鏈接:完整版為官網下載:30KB。min版本是我去掉了以上這個程序不需要的代碼:9KB。加載時候可提高效率。

完整版:jquery.form.js下載

min版:jquery.form.min.js下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM