最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript異步表單提交,圖片上傳,兼容異步模擬ajax技術(shù)

 更新時間:2010年05月10日 18:29:18   作者:  
使用Javascript異步表單提交,圖片上傳,兼容異步模擬ajax技術(shù),需要的朋友可以參考下。
前言:
咋一看標(biāo)題還挺長的呢,還有這么多功能,其實(shí)簡化一點(diǎn)就是一個功能,異步表單提交,只是在異步表單提交這個大功能下,可以實(shí)現(xiàn)圖片上傳,模擬ajax技術(shù)(其實(shí)很早以前就是通過這個方式來實(shí)現(xiàn)多瀏覽器的兼容ajax,這里只是懷懷舊,作為一個技術(shù)來玩玩),下面的內(nèi)容需要有一定的js基礎(chǔ),要不然理解起來會比較困難。
注意事項(xiàng):
這是我bBank里面的一個方法,現(xiàn)在我把他提取出來成一個通用方法來講解。
bBank 框架介紹:http://www.cnblogs.com/bruceli/archive/2010/04/15/bBank.html
為什么要提到bBank,因?yàn)樵谙旅娴姆椒ㄖ?,會使用到bBank的數(shù)組的判斷,字符串html轉(zhuǎn)換標(biāo)準(zhǔn)dom(我上一篇文章就介紹了這個,點(diǎn)擊見詳情),移除自己方法,css選擇器,所以大家看到不要陌生,你可以自己寫方法來替換這些方法,也可以直接用bBank的方法,可以下載bBank看源代碼。
b$.type.isArray(args) 判斷是否是數(shù)組
b$.parseDom(strs) 字符串直接轉(zhuǎn)換為標(biāo)準(zhǔn)的dom對象
b$('#bBankAsynFormSubmit_form_1b').removeSelf() 移除自己
b$() css選擇器
原理:
核心是通過iframe來完成異步。在頁面放入一個隱藏的iframe,表單有個屬性target,設(shè)置target為你要來進(jìn)行異步提交的iframe,那么當(dāng)你在提交表單的時候,其實(shí)是在使用iframe來作為提交顯示載體,頁面其它內(nèi)容是無刷新的。
其實(shí)原理很簡單,既然iframe是作為顯示載體的,那么我們擴(kuò)展下,如果提交的頁面是有返回值的,那么返回值會成為iframe的body里面的內(nèi)容,在通過iframe來取得body里面的內(nèi)容來,是不是和ajax有點(diǎn)像,這就是以前最早用來實(shí)現(xiàn)異步的方法了。
ajax是時間觸發(fā)制的,既然要模擬ajax,那么我們也要觸發(fā)事件,其實(shí)也很簡單,只要使用iframe的onload裝載完成事件就可以了。
實(shí)現(xiàn):
code:
復(fù)制代碼 代碼如下:

var asyn = {
formSubmit: function (args, action, func) {
this.clearContext();
this.callBack = null;
var subArr = [];
var subArrT = [];
if (b$.type.isArray(args)) {
subArr = args;
} else {
var tag = args.tagName.toLowerCase();
if (tag == "form") { for (var i = 0, num = args.childNodes.length; i < num; i++) { subArr.push(args.childNodes[i]); } }
else { subArr = [args]; }
}
//create asyn form and ifroma
var objForm = document.createElement("form");
objForm.action = action;
objForm.target = "bBankAsynFormSubmit_iframe_1b";
objForm.encoding = "multipart/form-data";
objForm.method = "post";
objForm.id = "bBankAsynFormSubmit_form_1b";
objForm.style.display = "none";
var objIframe = b$.parseDom('<iframe id="bBankAsynFormSubmit_iframe_1b" name="bBankAsynFormSubmit_iframe_1b" src="about:blank" style="display:none;" onload="javascript:setTimeout(\'asyn.complete()\',100)"></iframe>')[0];
//add submit value in form
for (var i = 0, num = subArr.length; i < num; i++) {
if (!subArr[i].name && subArr[i].nodeType == 1 && subArr[i].tagName.toLowerCase() == "input") subArr[i].name = "bBankAsynFormSubmit_input_1b_" + i;
var input = subArr[i].cloneNode(true);
subArrT.push(input);
subArr[i].parentNode.replaceChild(input, subArr[i]);
objForm.appendChild(subArr[i]);
}
//submit
document.body.appendChild(objIframe);
document.body.appendChild(objForm);
objForm.submit();
//dispose
for (var i = 0, num = subArrT.length; i < num; i++) { subArrT[i].parentNode.replaceChild(subArr[i], subArrT[i]); }
if (func) this.callBack = func;
},
complete: function () {
var responseText = "";
try {
var objIframe = document.getElementById("bBankAsynFormSubmit_iframe_1b");
if (objIframe.contentWindow) { responseText = objIframe.contentWindow.document.body.innerHTML; }
else { responseText = objIframe.contentDocument.document.body.innerHTML; }
} catch (err) { }
this.clearContext();
if (this.callBack) this.callBack(responseText);
},
clearContext: function () {
if (b$('#bBankAsynFormSubmit_form_1b')) b$('#bBankAsynFormSubmit_form_1b').removeSelf();
if (b$('#bBankAsynFormSubmit_iframe_1b')) b$('#bBankAsynFormSubmit_iframe_1b').removeSelf();
},
callBack: null
};

  簡單講解:
  其實(shí)里面比較麻煩的應(yīng)該是處理iframe的多瀏覽器兼容問題了,其實(shí)我們也不用去鉆牛角尖來討論iframe的這個兼容問題,我們把兼容交給瀏覽器自己來解析和解決,這里使用了字符串轉(zhuǎn)dom。
  首先我創(chuàng)建了一個form表單和iframe,都是隱藏的,把表單的內(nèi)容都轉(zhuǎn)到我創(chuàng)建的隱藏表單中,在把創(chuàng)建的隱藏表單提交。全部完成后在移除創(chuàng)建的表單和iframe。
  使用:
  asyn.formSubmit(args, action [, func]) arg:可以為一個form表單,一個input表單元素,input表單元素數(shù)組。 action:提交的url。 func:回調(diào)函數(shù)
例:asyn.formSubmit(inputArr, 'xxx.aspx', function(d){
      alert(d);
});
END
到這里就結(jié)束了,在這里向大家推薦一個我自己寫的js框架,上面的這個方法集成在框架里面了
使用:
復(fù)制代碼 代碼如下:

b$.asyn.formSubmit(inputArr, 'xxx.aspx', function(d){
    alert(d);
});

相關(guān)文章

  • js如何實(shí)現(xiàn)設(shè)計模式中的模板方法

    js如何實(shí)現(xiàn)設(shè)計模式中的模板方法

    都知道在js中如果定義兩個相同名稱的方法,前一個方法就會被后一個方法覆蓋掉,使用此特點(diǎn)就可以實(shí)現(xiàn)模板方法,感興趣的朋友可以了解下本文哈
    2013-07-07
  • 微信小程序獲取用戶信息及手機(jī)號(后端TP5.0)

    微信小程序獲取用戶信息及手機(jī)號(后端TP5.0)

    這篇文章主要為大家詳細(xì)介紹了微信小程序獲取用戶信息及手機(jī)號,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 淺談JS的原型和原型鏈

    淺談JS的原型和原型鏈

    在原型鏈中,Object是頂級公民,function是一級公民,其他的是二級公民,先記住這句話,下面我們來講解一下為什么這么說。
    2021-06-06
  • js簡單實(shí)現(xiàn)HTML標(biāo)簽Select聯(lián)動帶跳轉(zhuǎn)

    js簡單實(shí)現(xiàn)HTML標(biāo)簽Select聯(lián)動帶跳轉(zhuǎn)

    Select聯(lián)動帶跳轉(zhuǎn)的效果想必大家并不陌生吧,下面有個不錯的示例,感興趣的朋友可以參考下
    2013-10-10
  • JS模擬簡易滾動條效果代碼(附demo源碼)

    JS模擬簡易滾動條效果代碼(附demo源碼)

    這篇文章主要介紹了JS模擬簡易滾動條效果代碼,可模擬出滾動條拖動顯示的效果,涉及JavaScript鼠標(biāo)事件的響應(yīng)及頁面元素運(yùn)算的相關(guān)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2016-04-04
  • JavaScript測試工具之Karma-Jasmine的安裝和使用詳解

    JavaScript測試工具之Karma-Jasmine的安裝和使用詳解

    Jasmine是一個Javascript的測試工具,在Karma上運(yùn)行Jasmine可完成Javascript的自動化測試、生成覆蓋率報告等。本文不包含Jasmine的使用細(xì)節(jié),這幾天我會寫一篇Jasmine的入門文章,有興趣的朋友到時候可以看一下
    2015-12-12
  • Bootstrap表單Form全面解析

    Bootstrap表單Form全面解析

    在進(jìn)行自己的后臺改版時,大體布局都使用了bootstrap,剩下的表單部分沒理由不去使用它,對于表單的美化和布局,bootstrap做的也是很不錯的。下文給大家介紹Bootstrap表單Form全面解析,感興趣的朋友一起看下吧
    2016-06-06
  • 基于JavaScript操作DOM常用的API小結(jié)

    基于JavaScript操作DOM常用的API小結(jié)

    DOM(Document Object Model)即文檔對象模型,針對 HTML 和 XML 文檔的 API(應(yīng)用程序接口)。本篇文章給大家介紹javascript操作dom常用的api小結(jié),對javascript dom api相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • bootstrap-table.js擴(kuò)展分頁工具欄(增加跳轉(zhuǎn)到xx頁)功能

    bootstrap-table.js擴(kuò)展分頁工具欄(增加跳轉(zhuǎn)到xx頁)功能

    這篇文章主要介紹了bootstrap-table.js擴(kuò)展分頁工具欄,增加跳轉(zhuǎn)到xx頁功能,由于小編的水平停留在dom級,此次擴(kuò)展只支持頁面上的表格,如果大家有好的建議歡迎提出
    2017-12-12
  • javascript removeChild 導(dǎo)致的內(nèi)存泄漏

    javascript removeChild 導(dǎo)致的內(nèi)存泄漏

    最近看到司徒正美的一篇文章《移除DOM節(jié)點(diǎn)》,文中說到在IE中移除容器類節(jié)點(diǎn),會引起內(nèi)存泄露。
    2010-08-08

最新評論

上思县| 秦皇岛市| 盐山县| 石河子市| 杭州市| 彰武县| 通江县| 嘉义市| 亳州市| 宾阳县| 新干县| 南宁市| 临颍县| 房产| 黄龙县| 平顺县| 巴彦淖尔市| 五指山市| 塘沽区| 隆昌县| 多伦县| 清河县| 乡城县| 祥云县| 小金县| 攀枝花市| 大渡口区| 叙永县| 衡阳市| 广安市| 白河县| 棋牌| 日喀则市| 潮州市| 阿坝县| 双城市| 乌拉特前旗| 巴林右旗| 乌拉特后旗| 松阳县| 东阳市|