dwz.ajax.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. /**
  2. * @author ZhangHuihua@msn.com
  3. *
  4. */
  5. /**
  6. * 普通ajax表单提交
  7. * @param {Object} form
  8. * @param {Object} callback
  9. * @param {String} confirmMsg 提示确认信息
  10. */
  11. function validateCallback(form, callback, confirmMsg) {
  12. var $form = $(form);
  13. if (!$form.valid()) {
  14. return false;
  15. }
  16. var _submitFn = function(){
  17. $.ajax({
  18. type: form.method || 'POST',
  19. url:$form.attr("action"),
  20. data:$form.serializeArray(),
  21. dataType:"json",
  22. cache: false,
  23. success: callback || DWZ.ajaxDone,
  24. error: DWZ.ajaxError
  25. });
  26. }
  27. if (confirmMsg) {
  28. alertMsg.confirm(confirmMsg, {okCall: _submitFn});
  29. } else {
  30. _submitFn();
  31. }
  32. return false;
  33. }
  34. /**
  35. * 带文件上传的ajax表单提交
  36. * @param {Object} form
  37. * @param {Object} callback
  38. */
  39. function iframeCallback(form, callback){
  40. var $form = $(form), $iframe = $("#callbackframe");
  41. if(!$form.valid()) {return false;}
  42. if ($iframe.size() == 0) {
  43. $iframe = $("<iframe id='callbackframe' name='callbackframe' src='about:blank' style='display:none'></iframe>").appendTo("body");
  44. }
  45. if(!form.ajax) {
  46. $form.append('<input type="hidden" name="ajax" value="1" />');
  47. }
  48. form.target = "callbackframe";
  49. _iframeResponse($iframe[0], callback || DWZ.ajaxDone);
  50. }
  51. function _iframeResponse(iframe, callback){
  52. var $iframe = $(iframe), $document = $(document);
  53. $document.trigger("ajaxStart");
  54. $iframe.bind("load", function(event){
  55. $iframe.unbind("load");
  56. $document.trigger("ajaxStop");
  57. if (iframe.src == "javascript:'%3Chtml%3E%3C/html%3E';" || // For Safari
  58. iframe.src == "javascript:'<html></html>';") { // For FF, IE
  59. return;
  60. }
  61. var doc = iframe.contentDocument || iframe.document;
  62. // fixing Opera 9.26,10.00
  63. if (doc.readyState && doc.readyState != 'complete') return;
  64. // fixing Opera 9.64
  65. if (doc.body && doc.body.innerHTML == "false") return;
  66. var response;
  67. if (doc.XMLDocument) {
  68. // response is a xml document Internet Explorer property
  69. response = doc.XMLDocument;
  70. } else if (doc.body){
  71. try{
  72. response = $iframe.contents().find("body").text();
  73. response = jQuery.parseJSON(response);
  74. } catch (e){ // response is html document or plain text
  75. response = doc.body.innerHTML;
  76. }
  77. } else {
  78. // response is a xml document
  79. response = doc;
  80. }
  81. callback(response);
  82. });
  83. }
  84. /**
  85. * navTabAjaxDone是DWZ框架中预定义的表单提交回调函数.
  86. * 服务器转回navTabId可以把那个navTab标记为reloadFlag=1, 下次切换到那个navTab时会重新载入内容.
  87. * callbackType如果是closeCurrent就会关闭当前tab
  88. * 只有callbackType="forward"时需要forwardUrl值
  89. * navTabAjaxDone这个回调函数基本可以通用了,如果还有特殊需要也可以自定义回调函数.
  90. * 如果表单提交只提示操作是否成功, 就可以不指定回调函数. 框架会默认调用DWZ.ajaxDone()
  91. * <form action="/user.do?method=save" onsubmit="return validateCallback(this, navTabAjaxDone)">
  92. *
  93. * form提交后返回json数据结构statusCode=DWZ.statusCode.ok表示操作成功, 做页面跳转等操作. statusCode=DWZ.statusCode.error表示操作失败, 提示错误原因.
  94. * statusCode=DWZ.statusCode.timeout表示session超时,下次点击时跳转到DWZ.loginUrl
  95. * {"statusCode":"200", "message":"操作成功", "navTabId":"navNewsLi", "forwardUrl":"", "callbackType":"closeCurrent", "rel"."xxxId"}
  96. * {"statusCode":"300", "message":"操作失败"}
  97. * {"statusCode":"301", "message":"会话超时"}
  98. *
  99. */
  100. function navTabAjaxDone(json){
  101. DWZ.ajaxDone(json);
  102. if (json[DWZ.keys.statusCode] == DWZ.statusCode.ok){
  103. if (json.navTabId){ //把指定navTab页面标记为需要“重新载入”。注意navTabId不能是当前navTab页面的
  104. navTab.reloadFlag(json.navTabId);
  105. } else { //重新载入当前navTab页面
  106. var $pagerForm = $("#pagerForm", navTab.getCurrentPanel());
  107. var args = $pagerForm.size()>0 ? $pagerForm.serializeArray() : {}
  108. navTabPageBreak(args, json.rel);
  109. }
  110. if ("closeCurrent" == json.callbackType) {
  111. setTimeout(function(){navTab.closeCurrentTab(json.navTabId);}, 100);
  112. } else if ("forward" == json.callbackType) {
  113. navTab.reload(json.forwardUrl);
  114. } else if ("forwardConfirm" == json.callbackType) {
  115. alertMsg.confirm(json.confirmMsg || DWZ.msg("forwardConfirmMsg"), {
  116. okCall: function(){
  117. navTab.reload(json.forwardUrl);
  118. },
  119. cancelCall: function(){
  120. navTab.closeCurrentTab(json.navTabId);
  121. }
  122. });
  123. } else {
  124. navTab.getCurrentPanel().find(":input[initValue]").each(function(){
  125. var initVal = $(this).attr("initValue");
  126. $(this).val(initVal);
  127. });
  128. }
  129. }
  130. }
  131. /**
  132. * dialog上的表单提交回调函数
  133. * 当前navTab页面有pagerForm就重新加载
  134. * 服务器转回navTabId,可以重新载入指定的navTab. statusCode=DWZ.statusCode.ok表示操作成功, 自动关闭当前dialog
  135. *
  136. * form提交后返回json数据结构,json格式和navTabAjaxDone一致
  137. */
  138. function dialogAjaxDone(json){
  139. DWZ.ajaxDone(json);
  140. if (json[DWZ.keys.statusCode] == DWZ.statusCode.ok){
  141. if (json.navTabId){
  142. navTab.reload(json.forwardUrl, {navTabId: json.navTabId});
  143. } else {
  144. var $pagerForm = $("#pagerForm", navTab.getCurrentPanel());
  145. var args = $pagerForm.size()>0 ? $pagerForm.serializeArray() : {}
  146. navTabPageBreak(args, json.rel);
  147. }
  148. if ("closeCurrent" == json.callbackType) {
  149. $.pdialog.closeCurrent();
  150. }
  151. }
  152. }
  153. /*在对话框中操作数据,并刷新对话框*/
  154. function dialogAjaxDoneCloseAndReflush(json) {
  155. DWZ.ajaxDone(json);
  156. if (json.statusCode == DWZ.statusCode.ok){
  157. if (json.navTabId){
  158. navTab.reload(json.forwardUrl, {navTabId: json.navTabId});
  159. } else if (json.rel) {
  160. var $pagerForm = $("#pagerForm", navTab.getCurrentPanel());
  161. var args = $pagerForm.size()>0 ? $pagerForm.serializeArray() : {}
  162. navTabPageBreak(args, json.rel);
  163. }
  164. if ("closeCurrent" == json.callbackType) {
  165. $.pdialog.closeCurrent();
  166. }
  167. }
  168. $.pdialog.closeCurrent();
  169. navTab.reload();
  170. }
  171. /*在对话框中操作数据,并刷新对话框*/
  172. function dialogAjaxDoneReflush(json) {
  173. DWZ.ajaxDone(json);
  174. if (json.statusCode == DWZ.statusCode.ok){
  175. if (json.navTabId){
  176. navTab.reload(json.forwardUrl, {navTabId: json.navTabId});
  177. } else if (json.rel) {
  178. var $pagerForm = $("#pagerForm", navTab.getCurrentPanel());
  179. var args = $pagerForm.size()>0 ? $pagerForm.serializeArray() : {}
  180. navTabPageBreak(args, json.rel);
  181. }
  182. if ("closeCurrent" == json.callbackType) {
  183. $.pdialog.closeCurrent();
  184. }
  185. }
  186. //$.pdialog.closeCurrent();
  187. navTab.reload();
  188. }
  189. /*在对话框中操作数据,并刷新对话框*/
  190. function dialogAjaxDoneFather(json) {
  191. DWZ.ajaxDone(json);
  192. if (json.statusCode == DWZ.statusCode.ok) {
  193. if (json.navTabId) {
  194. var dialog = $("body").data(json.navTabId);
  195. $.pdialog.reload(dialog.data("url"), { data: {}, dialogId: json.navTabId, callback: null })
  196. }
  197. if ("closeCurrent" == json.callbackType) {
  198. $.pdialog.closeCurrent();
  199. }
  200. }
  201. }
  202. /**
  203. * 处理navTab上的查询, 会重新载入当前navTab
  204. * @param {Object} form
  205. */
  206. function navTabSearch(form, navTabId){
  207. var $form = $(form);
  208. if (form[DWZ.pageInfo.pageNum]) form[DWZ.pageInfo.pageNum].value = 1;
  209. navTab.reload($form.attr('action'), {data: $form.serializeArray(), navTabId:navTabId});
  210. return false;
  211. }
  212. /**
  213. * 处理dialog弹出层上的查询, 会重新载入当前dialog
  214. * @param {Object} form
  215. */
  216. function dialogSearch(form){
  217. var $form = $(form);
  218. if (form[DWZ.pageInfo.pageNum]) form[DWZ.pageInfo.pageNum].value = 1;
  219. $.pdialog.reload($form.attr('action'), {data: $form.serializeArray()});
  220. return false;
  221. }
  222. function dwzSearch(form, targetType){
  223. if (targetType == "dialog") dialogSearch(form);
  224. else navTabSearch(form);
  225. return false;
  226. }
  227. /**
  228. * 处理div上的局部查询, 会重新载入指定div
  229. * @param {Object} form
  230. */
  231. function divSearch(form, rel){
  232. var $form = $(form);
  233. if (form[DWZ.pageInfo.pageNum]) form[DWZ.pageInfo.pageNum].value = 1;
  234. if (rel) {
  235. var $box = $("#" + rel);
  236. $box.ajaxUrl({
  237. type:"POST", url:$form.attr("action"), data: $form.serializeArray(), callback:function(){
  238. $box.find("[layoutH]").layoutH();
  239. }
  240. });
  241. }
  242. return false;
  243. }
  244. /**
  245. *
  246. * @param {Object} args {pageNum:"",numPerPage:"",orderField:"",orderDirection:""}
  247. * @param String formId 分页表单选择器,非必填项默认值是 "pagerForm"
  248. */
  249. function _getPagerForm($parent, args) {
  250. var form = $("#pagerForm", $parent).get(0);
  251. if (form) {
  252. if (args["pageNum"]) form[DWZ.pageInfo.pageNum].value = args["pageNum"];
  253. if (args["numPerPage"]) form[DWZ.pageInfo.numPerPage].value = args["numPerPage"];
  254. if (args["orderField"]) form[DWZ.pageInfo.orderField].value = args["orderField"];
  255. if (args["orderDirection"] && form[DWZ.pageInfo.orderDirection]) form[DWZ.pageInfo.orderDirection].value = args["orderDirection"];
  256. }
  257. return form;
  258. }
  259. /**
  260. * 处理navTab中的分页和排序
  261. * targetType: navTab 或 dialog
  262. * rel: 可选 用于局部刷新div id号
  263. * data: pagerForm参数 {pageNum:"n", numPerPage:"n", orderField:"xxx", orderDirection:""}
  264. * callback: 加载完成回调函数
  265. */
  266. function dwzPageBreak(options){
  267. var op = $.extend({ targetType:"navTab", rel:"", data:{pageNum:"", numPerPage:"", orderField:"", orderDirection:""}, callback:null}, options);
  268. var $parent = op.targetType == "dialog" ? $.pdialog.getCurrent() : navTab.getCurrentPanel();
  269. if (op.rel) {
  270. var $box = $parent.find("#" + op.rel);
  271. var form = _getPagerForm($box, op.data);
  272. if (form) {
  273. $box.ajaxUrl({
  274. type:"POST", url:$(form).attr("action"), data: $(form).serializeArray(), callback:function(){
  275. $box.find("[layoutH]").layoutH();
  276. }
  277. });
  278. }
  279. } else {
  280. var form = _getPagerForm($parent, op.data);
  281. var params = $(form).serializeArray();
  282. if (op.targetType == "dialog") {
  283. if (form) $.pdialog.reload($(form).attr("action"), {data: params, callback: op.callback});
  284. } else {
  285. if (form) navTab.reload($(form).attr("action"), {data: params, callback: op.callback});
  286. }
  287. }
  288. }
  289. /**
  290. * 处理navTab中的分页和排序
  291. * @param args {pageNum:"n", numPerPage:"n", orderField:"xxx", orderDirection:""}
  292. * @param rel: 可选 用于局部刷新div id号
  293. */
  294. function navTabPageBreak(args, rel){
  295. dwzPageBreak({targetType:"navTab", rel:rel, data:args});
  296. }
  297. /**
  298. * 处理dialog中的分页和排序
  299. * 参数同 navTabPageBreak
  300. */
  301. function dialogPageBreak(args, rel){
  302. dwzPageBreak({targetType:"dialog", rel:rel, data:args});
  303. }
  304. function ajaxTodo(url, callback){
  305. var $callback = callback || navTabAjaxDone;
  306. if (! $.isFunction($callback)) $callback = eval('(' + callback + ')');
  307. $.ajax({
  308. type:'GET',
  309. url:url,
  310. dataType:"json",
  311. cache: false,
  312. success: $callback,
  313. error: DWZ.ajaxError
  314. });
  315. }
  316. function ajaxTodoPost(url, thisE, callback){
  317. var csrfVal = thisE.attr("csrfVal");
  318. var csrfName = thisE.attr("csrfName");
  319. var $callback = callback || navTabAjaxDone;
  320. if (! $.isFunction($callback)) $callback = eval('(' + callback + ')');
  321. $.ajax({
  322. type:'POST',
  323. url:url,
  324. dataType:"json",
  325. data: function(){
  326. var _data = {};
  327. if (csrfName && csrfVal) {
  328. _data[csrfName] = csrfVal;
  329. }
  330. return _data;
  331. }(),
  332. cache: false,
  333. success: $callback,
  334. error: DWZ.ajaxError
  335. });
  336. }
  337. /**
  338. * http://www.uploadify.com/documentation/uploadify/onqueuecomplete/
  339. */
  340. function uploadifyQueueComplete(queueData){
  341. var msg = "The total number of files uploaded: "+queueData.uploadsSuccessful+"<br/>"
  342. + "The total number of errors while uploading: "+queueData.uploadsErrored+"<br/>"
  343. + "The total number of bytes uploaded: "+queueData.queueBytesUploaded+"<br/>"
  344. + "The average speed of all uploaded files: "+queueData.averageSpeed;
  345. if (queueData.uploadsErrored) {
  346. alertMsg.error(msg);
  347. } else {
  348. alertMsg.correct(msg);
  349. }
  350. }
  351. /**
  352. * http://www.uploadify.com/documentation/uploadify/onuploadsuccess/
  353. */
  354. function uploadifySuccess(file, data, response){
  355. alert(data)
  356. }
  357. /**
  358. * http://www.uploadify.com/documentation/uploadify/onuploaderror/
  359. */
  360. function uploadifyError(file, errorCode, errorMsg) {
  361. alertMsg.error(errorCode+": "+errorMsg);
  362. }
  363. /**
  364. * http://www.uploadify.com/documentation/
  365. * @param {Object} event
  366. * @param {Object} queueID
  367. * @param {Object} fileObj
  368. * @param {Object} errorObj
  369. */
  370. function uploadifyError(event, queueId, fileObj, errorObj){
  371. alert("event:" + event + "\nqueueId:" + queueId + "\nfileObj.name:"
  372. + fileObj.name + "\nerrorObj.type:" + errorObj.type + "\nerrorObj.info:" + errorObj.info);
  373. }
  374. $.fn.extend({
  375. ajaxTodo:function(){
  376. return this.each(function(){
  377. var $this = $(this);
  378. $this.click(function(event){
  379. if ($this.hasClass('disabled')) {
  380. return false;
  381. }
  382. var url = unescape($this.attr("href")).replaceTmById($(event.target).parents(".unitBox:first"));
  383. DWZ.debug(url);
  384. if (!url.isFinishedTm()) {
  385. alertMsg.error($this.attr("warn") || DWZ.msg("alertSelectMsg"));
  386. return false;
  387. }
  388. var title = $this.attr("title");
  389. if (title) {
  390. alertMsg.confirm(title, {
  391. okCall: function(){
  392. ajaxTodoPost(url, $this, $this.attr("callback"));
  393. }
  394. });
  395. } else {
  396. ajaxTodoPost(url, $this, $this.attr("callback"));
  397. }
  398. event.preventDefault();
  399. });
  400. });
  401. },
  402. dwzExport: function(){
  403. function _doExport($this) {
  404. var $p = $this.attr("targetType") == "dialog" ? $.pdialog.getCurrent() : navTab.getCurrentPanel();
  405. var $form = $("#pagerForm", $p);
  406. var url = $this.attr("href");
  407. //window.location = url+(url.indexOf('?') == -1 ? "?" : "&")+$form.serialize();
  408. var $iframe = $("#callbackframe");
  409. if ($iframe.size() == 0) {
  410. $iframe = $("<iframe id='callbackframe' name='callbackframe' src='about:blank' style='display:none'></iframe>").appendTo("body");
  411. }
  412. form.target = "callbackframe";
  413. }
  414. return this.each(function(){
  415. var $this = $(this);
  416. $this.click(function(event){
  417. var title = $this.attr("title");
  418. if (title) {
  419. alertMsg.confirm(title, {
  420. okCall: function(){_doExport($this);}
  421. });
  422. } else {_doExport($this);}
  423. event.preventDefault();
  424. });
  425. });
  426. }
  427. });