DWZ官方文檔中關於文件上傳表單的提交:
因為Ajax不支持enctype="multipart/form-data" 所以用隱藏iframe來處理無刷新表單提交.
<form method="post" action="url" class="pageForm required-validate" enctype="multipart/form-data"
onsubmit="return iframeCallback(this, [navTabAjaxDone/dialogAjaxDone]);">
服務器端響應
DWZ-v1.2版本開始服務器返回和validateCallback格式保持一致:
{
"statusCode":"200",
"message":"操作成功",
"navTabId":"",
"rel":"",
"callbackType":"closeCurrent",
"forwardUrl":""
}
第一個坑是,因為要上傳文件,所以表單必須使用隱藏iframe的方式來處理,可是服務端返回的數據必須是JSON格式的,而不能使html,所以處理后的數據就不能展示了,只能說是提示操作狀態。
第二個坑是,因為上傳文件后在服務端分析數據后需要去展示,所以想着以彈窗的方式去展示,卻發現了另外一個坑,事情是這樣的:
dialog鏈接擴展:
<a href=”xxx” target=“dialog” [rel=“dialogId”]>
A所指向頁面將會在dialog 彈出層中打開,rel標識此彈出層的ID,rel為可選項。
Html標簽擴展方式示例:
<a href="w_dialog.html" target="dialog" rel="page2">彈出窗口</a> 或 <a href="demo_page1.html" target="dialog" [max=true, mask=true, maxable=true, minable=true, resizable=true,drawable=true]
rel="dlg_page1" title="[自定義標題]" width="800" height="480">打開窗口一</a>
關閉窗口:
在彈出窗口頁面內放置<button class="close" value="關閉"></button>即可。
JS調用方法示例:
$.pdialog.open(url, dlgId, title); 或 $.pdialog.open(url, dlgId, title, options);
也就是說要想在頁面打開一個彈窗,就必須要加載一個頁面,指定一個地址,不然的話就給你報錯。。。為啥不能展示本地數據呢。。。好蛋疼的設計。
為了展示數據,於是乎在分析完文件數據后將結果存到了memcache中,然后返回一個Key放到了返回json中,好在可以自定義回調函數,將key放到一個連接中通過jQ模擬提交,通過另一個頁面展示出來。擦,好糾結的業務邏輯。。。淚奔了。。。
自定義的回調函數:
// 彈出被覆蓋的數據
function customAjaxDone(json){
if (json.statusCode == DWZ.statusCode.ok){
if (json.content.toString() == "xxx"){
DWZ.ajaxDone(json);
} else {
$("#xxx").attr("href", "{{ wrap_url('xxx/show_replace_data?hash=')}}" + json.content);
$("#xxx").click();
}
}
else{
DWZ.ajaxDone(json);
}
}
表單事件:
onsubmit="return iframeCallback(this, customAjaxDone);"
