8bb7d77be976d934cfb52eaa51e6eb3be2acc2ce.svn-base 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. /**
  2. * jQuery EasyUI 1.3.6
  3. *
  4. * Copyright (c) 2009-2014 www.jeasyui.com. All rights reserved.
  5. *
  6. * Licensed under the GPL license: http://www.gnu.org/licenses/gpl.txt
  7. * To use it on other terms please contact us at info@jeasyui.com
  8. *
  9. */
  10. /**
  11. * form - jQuery EasyUI
  12. *
  13. */
  14. (function($){
  15. /**
  16. * submit the form
  17. */
  18. function ajaxSubmit(target, options){
  19. options = options || {};
  20. var param = {};
  21. if (options.onSubmit){
  22. if (options.onSubmit.call(target, param) == false) {
  23. return;
  24. }
  25. }
  26. var form = $(target);
  27. if (options.url){
  28. form.attr('action', options.url);
  29. }
  30. var frameId = 'easyui_frame_' + (allGetServerTime().getTime());
  31. var frame = $('<iframe id='+frameId+' name='+frameId+'></iframe>')
  32. .attr('src', window.ActiveXObject ? 'javascript:false' : 'about:blank')
  33. .css({
  34. position:'absolute',
  35. top:-1000,
  36. left:-1000
  37. });
  38. var t = form.attr('target'), a = form.attr('action');
  39. form.attr('target', frameId);
  40. var paramFields = $();
  41. try {
  42. frame.appendTo('body');
  43. frame.bind('load', cb);
  44. for(var n in param){
  45. var f = $('<input type="hidden" name="' + n + '">').val(param[n]).appendTo(form);
  46. paramFields = paramFields.add(f);
  47. }
  48. checkState();
  49. form[0].submit();
  50. } finally {
  51. form.attr('action', a);
  52. t ? form.attr('target', t) : form.removeAttr('target');
  53. paramFields.remove();
  54. }
  55. function checkState(){
  56. var f = $('#'+frameId);
  57. if (!f.length){return}
  58. try{
  59. var s = f.contents()[0].readyState;
  60. if (s && s.toLowerCase() == 'uninitialized'){
  61. setTimeout(checkState, 100);
  62. }
  63. } catch(e){
  64. cb();
  65. }
  66. }
  67. var checkCount = 10;
  68. function cb(){
  69. var frame = $('#'+frameId);
  70. if (!frame.length){return}
  71. frame.unbind();
  72. var data = '';
  73. try{
  74. var body = frame.contents().find('body');
  75. data = body.html();
  76. if (data == ''){
  77. if (--checkCount){
  78. setTimeout(cb, 100);
  79. return;
  80. }
  81. // return;
  82. }
  83. var ta = body.find('>textarea');
  84. if (ta.length){
  85. data = ta.val();
  86. } else {
  87. var pre = body.find('>pre');
  88. if (pre.length){
  89. data = pre.html();
  90. }
  91. }
  92. } catch(e){
  93. }
  94. if (options.success){
  95. options.success(data);
  96. }
  97. setTimeout(function(){
  98. frame.unbind();
  99. frame.remove();
  100. }, 100);
  101. }
  102. }
  103. /**
  104. * load form data
  105. * if data is a URL string type load from remote site,
  106. * otherwise load from local data object.
  107. */
  108. function load(target, data){
  109. if (!$.data(target, 'form')){
  110. $.data(target, 'form', {
  111. options: $.extend({}, $.fn.form.defaults)
  112. });
  113. }
  114. var opts = $.data(target, 'form').options;
  115. if (typeof data == 'string'){
  116. var param = {};
  117. if (opts.onBeforeLoad.call(target, param) == false) return;
  118. $.ajax({
  119. url: data,
  120. data: param,
  121. dataType: 'json',
  122. success: function(data){
  123. _load(data);
  124. },
  125. error: function(){
  126. opts.onLoadError.apply(target, arguments);
  127. }
  128. });
  129. } else {
  130. _load(data);
  131. }
  132. function _load(data){
  133. var form = $(target);
  134. for(var name in data){
  135. var val = data[name];
  136. var rr = _checkField(name, val);
  137. if (!rr.length){
  138. // var f = form.find('input[numberboxName="'+name+'"]');
  139. // if (f.length){
  140. // f.numberbox('setValue', val); // set numberbox value
  141. // } else {
  142. // $('input[name="'+name+'"]', form).val(val);
  143. // $('textarea[name="'+name+'"]', form).val(val);
  144. // $('select[name="'+name+'"]', form).val(val);
  145. // }
  146. var count = _loadOther(name, val);
  147. if (!count){
  148. $('input[name="'+name+'"]', form).val(val);
  149. $('textarea[name="'+name+'"]', form).val(val);
  150. $('select[name="'+name+'"]', form).val(val);
  151. }
  152. }
  153. _loadCombo(name, val);
  154. }
  155. opts.onLoadSuccess.call(target, data);
  156. validate(target);
  157. }
  158. /**
  159. * check the checkbox and radio fields
  160. */
  161. function _checkField(name, val){
  162. var rr = $(target).find('input[name="'+name+'"][type=radio], input[name="'+name+'"][type=checkbox]');
  163. rr._propAttr('checked', false);
  164. rr.each(function(){
  165. var f = $(this);
  166. if (f.val() == String(val) || $.inArray(f.val(), $.isArray(val)?val:[val]) >= 0){
  167. f._propAttr('checked', true);
  168. }
  169. });
  170. return rr;
  171. }
  172. function _loadOther(name, val){
  173. var count = 0;
  174. var pp = ['numberbox','slider'];
  175. for(var i=0; i<pp.length; i++){
  176. var p = pp[i];
  177. var f = $(target).find('input['+p+'Name="'+name+'"]');
  178. if (f.length){
  179. f[p]('setValue', val);
  180. count += f.length;
  181. }
  182. }
  183. return count;
  184. }
  185. function _loadCombo(name, val){
  186. var form = $(target);
  187. var cc = ['combobox','combotree','combogrid','datetimebox','datebox','combo'];
  188. var c = form.find('[comboName="' + name + '"]');
  189. if (c.length){
  190. for(var i=0; i<cc.length; i++){
  191. var type = cc[i];
  192. if (c.hasClass(type+'-f')){
  193. if (c[type]('options').multiple){
  194. c[type]('setValues', val);
  195. } else {
  196. c[type]('setValue', val);
  197. }
  198. return;
  199. }
  200. }
  201. }
  202. }
  203. }
  204. /**
  205. * clear the form fields
  206. */
  207. function clear(target){
  208. $('input,select,textarea', target).each(function(){
  209. var t = this.type, tag = this.tagName.toLowerCase();
  210. if (t == 'text' || t == 'hidden' || t == 'password' || tag == 'textarea'){
  211. this.value = '';
  212. } else if (t == 'file'){
  213. var file = $(this);
  214. var newfile = file.clone().val('');
  215. newfile.insertAfter(file);
  216. if (file.data('validatebox')){
  217. file.validatebox('destroy');
  218. newfile.validatebox();
  219. } else {
  220. file.remove();
  221. }
  222. } else if (t == 'checkbox' || t == 'radio'){
  223. this.checked = false;
  224. } else if (tag == 'select'){
  225. this.selectedIndex = -1;
  226. }
  227. });
  228. // if ($.fn.combo) $('.combo-f', target).combo('clear');
  229. // if ($.fn.combobox) $('.combobox-f', target).combobox('clear');
  230. // if ($.fn.combotree) $('.combotree-f', target).combotree('clear');
  231. // if ($.fn.combogrid) $('.combogrid-f', target).combogrid('clear');
  232. var t = $(target);
  233. var plugins = ['combo','combobox','combotree','combogrid','slider'];
  234. for(var i=0; i<plugins.length; i++){
  235. var plugin = plugins[i];
  236. var r = t.find('.'+plugin+'-f');
  237. if (r.length && r[plugin]){
  238. r[plugin]('clear');
  239. }
  240. }
  241. validate(target);
  242. }
  243. function reset(target){
  244. target.reset();
  245. var t = $(target);
  246. // if ($.fn.combo){t.find('.combo-f').combo('reset');}
  247. // if ($.fn.combobox){t.find('.combobox-f').combobox('reset');}
  248. // if ($.fn.combotree){t.find('.combotree-f').combotree('reset');}
  249. // if ($.fn.combogrid){t.find('.combogrid-f').combogrid('reset');}
  250. // if ($.fn.datebox){t.find('.datebox-f').datebox('reset');}
  251. // if ($.fn.datetimebox){t.find('.datetimebox-f').datetimebox('reset');}
  252. // if ($.fn.spinner){t.find('.spinner-f').spinner('reset');}
  253. // if ($.fn.timespinner){t.find('.timespinner-f').timespinner('reset');}
  254. // if ($.fn.numberbox){t.find('.numberbox-f').numberbox('reset');}
  255. // if ($.fn.numberspinner){t.find('.numberspinner-f').numberspinner('reset');}
  256. var plugins = ['combo','combobox','combotree','combogrid','datebox','datetimebox','spinner','timespinner','numberbox','numberspinner','slider'];
  257. for(var i=0; i<plugins.length; i++){
  258. var plugin = plugins[i];
  259. var r = t.find('.'+plugin+'-f');
  260. if (r.length && r[plugin]){
  261. r[plugin]('reset');
  262. }
  263. }
  264. validate(target);
  265. }
  266. /**
  267. * set the form to make it can submit with ajax.
  268. */
  269. function setForm(target){
  270. var options = $.data(target, 'form').options;
  271. var form = $(target);
  272. form.unbind('.form').bind('submit.form', function(){
  273. setTimeout(function(){
  274. ajaxSubmit(target, options);
  275. }, 0);
  276. return false;
  277. });
  278. }
  279. // function validate(target){
  280. // if ($.fn.validatebox){
  281. // var box = $('.validatebox-text', target);
  282. // if (box.length){
  283. // box.validatebox('validate');
  284. //// box.trigger('focus');
  285. //// box.trigger('blur');
  286. // var invalidbox = $('.validatebox-invalid:first', target).focus();
  287. // return invalidbox.length == 0;
  288. // }
  289. // }
  290. // return true;
  291. // }
  292. function validate(target){
  293. if ($.fn.validatebox){
  294. var t = $(target);
  295. t.find('.validatebox-text:not(:disabled)').validatebox('validate');
  296. var invalidbox = t.find('.validatebox-invalid');
  297. invalidbox.filter(':not(:disabled):first').focus();
  298. return invalidbox.length == 0;
  299. }
  300. return true;
  301. }
  302. function setValidation(target, novalidate){
  303. $(target).find('.validatebox-text:not(:disabled)').validatebox(novalidate ? 'disableValidation' : 'enableValidation');
  304. }
  305. $.fn.form = function(options, param){
  306. if (typeof options == 'string'){
  307. return $.fn.form.methods[options](this, param);
  308. }
  309. options = options || {};
  310. return this.each(function(){
  311. if (!$.data(this, 'form')){
  312. $.data(this, 'form', {
  313. options: $.extend({}, $.fn.form.defaults, options)
  314. });
  315. }
  316. setForm(this);
  317. });
  318. };
  319. $.fn.form.methods = {
  320. submit: function(jq, options){
  321. return jq.each(function(){
  322. var opts = $.extend({},
  323. $.fn.form.defaults,
  324. $.data(this, 'form') ? $.data(this, 'form').options : {},
  325. options||{}
  326. );
  327. ajaxSubmit(this, opts);
  328. });
  329. },
  330. load: function(jq, data){
  331. return jq.each(function(){
  332. load(this, data);
  333. });
  334. },
  335. clear: function(jq){
  336. return jq.each(function(){
  337. clear(this);
  338. });
  339. },
  340. reset: function(jq){
  341. return jq.each(function(){
  342. reset(this);
  343. });
  344. },
  345. validate: function(jq){
  346. return validate(jq[0]);
  347. },
  348. disableValidation: function(jq){
  349. return jq.each(function(){
  350. setValidation(this, true);
  351. });
  352. },
  353. enableValidation: function(jq){
  354. return jq.each(function(){
  355. setValidation(this, false);
  356. });
  357. }
  358. };
  359. $.fn.form.defaults = {
  360. url: null,
  361. onSubmit: function(param){return $(this).form('validate');},
  362. success: function(data){},
  363. onBeforeLoad: function(param){},
  364. onLoadSuccess: function(data){},
  365. onLoadError: function(){}
  366. };
  367. })(jQuery);