国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

asp.net 簡便無刷新文件上傳系統

2020-01-18 00:30:00
字體:
來源:轉載
供稿:網友
ps:flash實現的效果是好得多,但這不是我研究的范圍,也沒什么可比性。

兼容:ie6/7/8, firefox 3.5.5, opera 10.01, safari 4.0.3, chrome 3.0
效果預覽
文件上傳
選擇文件重命名操作狀態
重置選擇文件
重置選擇文件
重置選擇文件

ps:由于需要后臺,要測試系統請下載實例測試。
ps2:在完整實例文件中,還有一個文件屬性查看實例。

程序說明

【upload】

程序中最重要的方法就是upload了,調用它就可以進行無刷新上傳。
upload的過程是這樣的,首先用stop方法停止上一次上傳,并判斷是否選擇文件。
然后分別調用_setIframe,_setForm和_setInput,生成需要的iframe,form和input。

如果設置了timeout屬性的話,會自動設置計時器:
復制代碼 代碼如下:

if ( this.timeout > 0 ) {
this._timer = setTimeout( $$F.bind(this._timeout, this), this.timeout * 1000 );
}

ps:經測試,小于0的延時時間,ie會取消執行,而其他瀏覽器會當成0執行。

程序有一個_sending屬性用來判斷上傳狀態。
在stop(停止),dispose(銷毀),_finis(完成),_timeout(超時)時會把它設為false。
而在上傳開始前要把它設置為true。

最后提交表單就開始上傳了。

【iframe】

程序使用_setIframe函數來創建無刷新需要的iframe。

由于ie中iframe的name不能修改的問題,要這樣創建iframe:
復制代碼 代碼如下:

var iframename = "QUICKUPLOAD_" + QuickUpload._counter++,
iframe = document.createElement( $$B.ie ? "<iframe name=/"" + iframename + "/">" : "iframe");
iframe.name = iframename;
iframe.style.display = "none";

ps:關于iframe的name的問題參考這里的iframe部分。
ie8已經可以修改name了,但在非標準(怪辟)模式下還是不能修改。
其中使用了一個QuickUpload函數自身的_counter屬性做計算器,這就能保證各個實例的iframe的name就不會重復。

為了能在文件上傳完成后執行回調函數,會在iframe的onload中執行_finish函數:
復制代碼 代碼如下:

var finish = this._fFINISH = $$F.bind(this._finish, this);
if ( $$B.ie ) {
iframe.attachEvent( "onload", finish );
} else {
iframe.onload = $$B.opera ? function(){ this.onload = finish; } : finish;
}

在ie需要用attachEvent來綁定onload,因為在ie中直接設置onload是無效的。
除了用attachEvent還可以用onreadystatechange代替。
至于原因我也不清楚,詳細參考“判斷 iframe 是否加載完成的完美方法”。

iframe的加載還有一個問題,測試以下代碼:

復制代碼 代碼如下:

<body><div id="msg">狀態:</div></body>
<script>
var msg = document.getElementById("msg");
var iframe = document.createElement("iframe");
iframe.onload = function(){ msg.innerHTML += "onload,"; }
document.body.appendChild(iframe);
iframe.src = "http://cloudgamer.cnblogs.com/"
</script>

結果safari, chrome都會觸發onload兩次,而opera, ff和ie(請自行兼容)都是1次。

估計在safari和chrome在appendChild之后就進行第一次加載,并且在設置src之前加載完畢,所以觸發了兩次。
如果在插入body之前給iframe隨便設置一個src(除了空值),間接加長第一次加載,那么也只觸發一次了。
ps:不設置或空值的src相當于鏈接到“about:blank”(空白頁)。

那么opera, ff和ie可能是第一次加載太慢,第二次覆蓋了第一次的,所以只觸發了一次onload。
ps:也可能是其他原因,例如瀏覽器優化之類的,我也不確定。

針對加載過快的問題,可以在onload的時候根據_sending確定之前是否上傳狀態來解決。
雖然沒測試出來,會不會有_sending設置之后submit之前剛好觸發第一次onload的情況呢?
針對這個問題,在upload方法中會把_sending放在submit之后設置。
那如果在submit之后_sending設置之前就觸發了onload呢?(... 主站蜘蛛池模板: 阿拉善右旗| 北宁市| 寿阳县| 禹州市| 晴隆县| 平顶山市| 富阳市| 洞头县| 定安县| 齐齐哈尔市| 信丰县| 进贤县| 和龙市| 双桥区| 会同县| 鄂尔多斯市| 汕头市| 镇赉县| 易门县| 蛟河市| 汉中市| 汝阳县| 攀枝花市| 南昌市| 滁州市| 涿鹿县| 乐平市| 方正县| 怀集县| 淅川县| 祁门县| 大港区| 浙江省| 肇州县| 紫阳县| 望奎县| 东海县| 邳州市| 盖州市| 五寨县| 英超|