jquery.form.min.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. /*
  2. * jQuery Form Plugin; v20131017
  3. * http://jquery.malsup.com/form/
  4. * Copyright (c) 2013 M. Alsup; Dual licensed: MIT/GPL
  5. * https://github.com/malsup/form#copyright-and-license
  6. */
  7. ;
  8. $(function () {
  9. (function (e) {
  10. "use strict";
  11. function t(t) {
  12. var r = t.data;
  13. t.isDefaultPrevented() || (t.preventDefault(), e(t.target).ajaxSubmit(r))
  14. }
  15. function r(t) {
  16. var r = t.target,
  17. a = e(r);
  18. if (!a.is("[type=submit],[type=image]")) {
  19. var n = a.closest("[type=submit]");
  20. if (0 === n.length) return;
  21. r = n[0]
  22. }
  23. var i = this;
  24. if (i.clk = r, "image" == r.type)
  25. if (void 0 !== t.offsetX) i.clk_x = t.offsetX, i.clk_y = t.offsetY;
  26. else if ("function" == typeof e.fn.offset) {
  27. var o = a.offset();
  28. i.clk_x = t.pageX - o.left, i.clk_y = t.pageY - o.top
  29. } else i.clk_x = t.pageX - r.offsetLeft, i.clk_y = t.pageY - r.offsetTop;
  30. setTimeout(function () {
  31. i.clk = i.clk_x = i.clk_y = null
  32. }, 100)
  33. }
  34. function a() {
  35. if (e.fn.ajaxSubmit.debug) {
  36. var t = "[jquery.form] " + Array.prototype.join.call(arguments, "");
  37. window.console && window.console.log ? window.console.log(t) : window.opera && window.opera.postError && window.opera.postError(t)
  38. }
  39. }
  40. var n = {};
  41. n.fileapi = void 0 !== e("<input type='file'/>").get(0).files, n.formdata = void 0 !== window.FormData;
  42. var i = !!e.fn.prop;
  43. e.fn.attr2 = function () {
  44. if (!i) return this.attr.apply(this, arguments);
  45. var e = this.prop.apply(this, arguments);
  46. return e && e.jquery || "string" == typeof e ? e : this.attr.apply(this, arguments)
  47. }, e.fn.ajaxSubmit = function (t) {
  48. function r(r) {
  49. var a, n, i = e.param(r, t.traditional).split("&"),
  50. o = i.length,
  51. s = [];
  52. for (a = 0; o > a; a++) i[a] = i[a].replace(/\+/g, " "), n = i[a].split("="), s.push([decodeURIComponent(n[0]), decodeURIComponent(n[1])]);
  53. return s
  54. }
  55. function o(a) {
  56. for (var n = new FormData, i = 0; a.length > i; i++) n.append(a[i].name, a[i].value);
  57. if (t.extraData) {
  58. var o = r(t.extraData);
  59. for (i = 0; o.length > i; i++) o[i] && n.append(o[i][0], o[i][1])
  60. }
  61. t.data = null;
  62. var s = e.extend(!0, {}, e.ajaxSettings, t, {
  63. contentType: !1,
  64. processData: !1,
  65. cache: !1,
  66. type: u || "POST"
  67. });
  68. t.uploadProgress && (s.xhr = function () {
  69. var r = e.ajaxSettings.xhr();
  70. return r.upload && r.upload.addEventListener("progress", function (e) {
  71. var r = 0,
  72. a = e.loaded || e.position,
  73. n = e.total;
  74. e.lengthComputable && (r = Math.ceil(100 * (a / n))), t.uploadProgress(e, a, n, r)
  75. }, !1), r
  76. }), s.data = null;
  77. var l = s.beforeSend;
  78. return s.beforeSend = function (e, r) {
  79. r.data = t.formData ? t.formData : n, l && l.call(this, e, r)
  80. }, e.ajax(s)
  81. }
  82. function s(r) {
  83. function n(e) {
  84. var t = null;
  85. try {
  86. e.contentWindow && (t = e.contentWindow.document)
  87. } catch (r) {
  88. a("cannot get iframe.contentWindow document: " + r)
  89. }
  90. if (t) return t;
  91. try {
  92. t = e.contentDocument ? e.contentDocument : e.document
  93. } catch (r) {
  94. a("cannot get iframe.contentDocument: " + r), t = e.document
  95. }
  96. return t
  97. }
  98. function o() {
  99. function t() {
  100. try {
  101. var e = n(g).readyState;
  102. a("state = " + e), e && "uninitialized" == e.toLowerCase() && setTimeout(t, 50)
  103. } catch (r) {
  104. a("Server abort: ", r, " (", r.name, ")"), s(k), j && clearTimeout(j), j = void 0
  105. }
  106. }
  107. var r = f.attr2("target"),
  108. i = f.attr2("action");
  109. w.setAttribute("target", d), (!u || /post/i.test(u)) && w.setAttribute("method", "POST"), i != m.url && w.setAttribute("action", m.url), m.skipEncodingOverride || u && !/post/i.test(u) || f.attr({
  110. encoding: "multipart/form-data",
  111. enctype: "multipart/form-data"
  112. }), m.timeout && (j = setTimeout(function () {
  113. T = !0, s(D)
  114. }, m.timeout));
  115. var o = [];
  116. try {
  117. if (m.extraData)
  118. for (var l in m.extraData) m.extraData.hasOwnProperty(l) && (e.isPlainObject(m.extraData[l]) && m.extraData[l].hasOwnProperty("name") && m.extraData[l].hasOwnProperty("value") ? o.push(e('<input type="hidden" name="' + m.extraData[l].name + '">').val(m.extraData[l].value).appendTo(w)[0]) : o.push(e('<input type="hidden" name="' + l + '">').val(m.extraData[l]).appendTo(w)[0]));
  119. m.iframeTarget || v.appendTo("body"), g.attachEvent ? g.attachEvent("onload", s) : g.addEventListener("load", s, !1), setTimeout(t, 15);
  120. try {
  121. w.submit()
  122. } catch (c) {
  123. var p = document.createElement("form").submit;
  124. p.apply(w)
  125. }
  126. } finally {
  127. w.setAttribute("action", i), r ? w.setAttribute("target", r) : f.removeAttr("target"), e(o).remove()
  128. }
  129. }
  130. function s(t) {
  131. if (!x.aborted && !F) {
  132. if (M = n(g), M || (a("cannot access response document"), t = k), t === D && x) return x.abort("timeout"), S.reject(x, "timeout"), void 0;
  133. if (t == k && x) return x.abort("server abort"), S.reject(x, "error", "server abort"), void 0;
  134. if (M && M.location.href != m.iframeSrc || T) {
  135. g.detachEvent ? g.detachEvent("onload", s) : g.removeEventListener("load", s, !1);
  136. var r, i = "success";
  137. try {
  138. if (T) throw "timeout";
  139. var o = "xml" == m.dataType || M.XMLDocument || e.isXMLDoc(M);
  140. if (a("isXml=" + o), !o && window.opera && (null === M.body || !M.body.innerHTML) && --O) return a("requeing onLoad callback, DOM not available"), setTimeout(s, 250), void 0;
  141. var u = M.body ? M.body : M.documentElement;
  142. x.responseText = u ? u.innerHTML : null, x.responseXML = M.XMLDocument ? M.XMLDocument : M, o && (m.dataType = "xml"), x.getResponseHeader = function (e) {
  143. var t = {
  144. "content-type": m.dataType
  145. };
  146. return t[e.toLowerCase()]
  147. }, u && (x.status = Number(u.getAttribute("status")) || x.status, x.statusText = u.getAttribute("statusText") || x.statusText);
  148. var l = (m.dataType || "").toLowerCase(),
  149. c = /(json|script|text)/.test(l);
  150. if (c || m.textarea) {
  151. var f = M.getElementsByTagName("textarea")[0];
  152. if (f) x.responseText = f.value, x.status = Number(f.getAttribute("status")) || x.status, x.statusText = f.getAttribute("statusText") || x.statusText;
  153. else if (c) {
  154. var d = M.getElementsByTagName("pre")[0],
  155. h = M.getElementsByTagName("body")[0];
  156. d ? x.responseText = d.textContent ? d.textContent : d.innerText : h && (x.responseText = h.textContent ? h.textContent : h.innerText)
  157. }
  158. } else "xml" == l && !x.responseXML && x.responseText && (x.responseXML = X(x.responseText));
  159. try {
  160. E = _(x, l, m)
  161. } catch (b) {
  162. i = "parsererror", x.error = r = b || i
  163. }
  164. } catch (b) {
  165. a("error caught: ", b), i = "error", x.error = r = b || i
  166. }
  167. x.aborted && (a("upload aborted"), i = null), x.status && (i = x.status >= 200 && 300 > x.status || 304 === x.status ? "success" : "error"), "success" === i ? (m.success && m.success.call(m.context, E, "success", x), S.resolve(x.responseText, "success", x), p && e.event.trigger("ajaxSuccess", [x, m])) : i && (void 0 === r && (r = x.statusText), m.error && m.error.call(m.context, x, i, r), S.reject(x, "error", r), p && e.event.trigger("ajaxError", [x, m, r])), p && e.event.trigger("ajaxComplete", [x, m]), p && !--e.active && e.event.trigger("ajaxStop"), m.complete && m.complete.call(m.context, x, i), F = !0, m.timeout && clearTimeout(j), setTimeout(function () {
  168. m.iframeTarget ? v.attr("src", m.iframeSrc) : v.remove(), x.responseXML = null
  169. }, 100)
  170. }
  171. }
  172. }
  173. var l, c, m, p, d, v, g, x, b, y, T, j, w = f[0],
  174. S = e.Deferred();
  175. if (S.abort = function (e) {
  176. x.abort(e)
  177. }, r)
  178. for (c = 0; h.length > c; c++) l = e(h[c]), i ? l.prop("disabled", !1) : l.removeAttr("disabled");
  179. if (m = e.extend(!0, {}, e.ajaxSettings, t), m.context = m.context || m, d = "jqFormIO" + (new Date).getTime(), m.iframeTarget ? (v = e(m.iframeTarget), y = v.attr2("name"), y ? d = y : v.attr2("name", d)) : (v = e('<iframe name="' + d + '" src="' + m.iframeSrc + '" />'), v.css({
  180. position: "absolute",
  181. top: "-1000px",
  182. left: "-1000px"
  183. })), g = v[0], x = {
  184. aborted: 0,
  185. responseText: null,
  186. responseXML: null,
  187. status: 0,
  188. statusText: "n/a",
  189. getAllResponseHeaders: function () {},
  190. getResponseHeader: function () {},
  191. setRequestHeader: function () {},
  192. abort: function (t) {
  193. var r = "timeout" === t ? "timeout" : "aborted";
  194. a("aborting upload... " + r), this.aborted = 1;
  195. try {
  196. g.contentWindow.document.execCommand && g.contentWindow.document.execCommand("Stop")
  197. } catch (n) {}
  198. v.attr("src", m.iframeSrc), x.error = r, m.error && m.error.call(m.context, x, r, t), p && e.event.trigger("ajaxError", [x, m, r]), m.complete && m.complete.call(m.context, x, r)
  199. }
  200. }, p = m.global, p && 0 === e.active++ && e.event.trigger("ajaxStart"), p && e.event.trigger("ajaxSend", [x, m]), m.beforeSend && m.beforeSend.call(m.context, x, m) === !1) return m.global && e.active--, S.reject(), S;
  201. if (x.aborted) return S.reject(), S;
  202. b = w.clk, b && (y = b.name, y && !b.disabled && (m.extraData = m.extraData || {}, m.extraData[y] = b.value, "image" == b.type && (m.extraData[y + ".x"] = w.clk_x, m.extraData[y + ".y"] = w.clk_y)));
  203. var D = 1,
  204. k = 2,
  205. A = e("meta[name=csrf-token]").attr("content"),
  206. L = e("meta[name=csrf-param]").attr("content");
  207. L && A && (m.extraData = m.extraData || {}, m.extraData[L] = A), m.forceSync ? o() : setTimeout(o, 10);
  208. var E, M, F, O = 50,
  209. X = e.parseXML || function (e, t) {
  210. return window.ActiveXObject ? (t = new ActiveXObject("Microsoft.XMLDOM"), t.async = "false", t.loadXML(e)) : t = (new DOMParser).parseFromString(e, "text/xml"), t && t.documentElement && "parsererror" != t.documentElement.nodeName ? t : null
  211. },
  212. C = e.parseJSON || function (e) {
  213. return window.eval("(" + e + ")")
  214. },
  215. _ = function (t, r, a) {
  216. var n = t.getResponseHeader("content-type") || "",
  217. i = "xml" === r || !r && n.indexOf("xml") >= 0,
  218. o = i ? t.responseXML : t.responseText;
  219. return i && "parsererror" === o.documentElement.nodeName && e.error && e.error("parsererror"), a && a.dataFilter && (o = a.dataFilter(o, r)), "string" == typeof o && ("json" === r || !r && n.indexOf("json") >= 0 ? o = C(o) : ("script" === r || !r && n.indexOf("javascript") >= 0) && e.globalEval(o)), o
  220. };
  221. return S
  222. }
  223. if (!this.length) return a("ajaxSubmit: skipping submit process - no element selected"), this;
  224. var u, l, c, f = this;
  225. "function" == typeof t ? t = {
  226. success: t
  227. } : void 0 === t && (t = {}), u = t.type || this.attr2("method"), l = t.url || this.attr2("action"), c = "string" == typeof l ? e.trim(l) : "", c = c || window.location.href || "", c && (c = (c.match(/^([^#]+)/) || [])[1]), t = e.extend(!0, {
  228. url: c,
  229. success: e.ajaxSettings.success,
  230. type: u || e.ajaxSettings.type,
  231. iframeSrc: /^https/i.test(window.location.href || "") ? "javascript:false" : "about:blank"
  232. }, t);
  233. var m = {};
  234. if (this.trigger("form-pre-serialize", [this, t, m]), m.veto) return a("ajaxSubmit: submit vetoed via form-pre-serialize trigger"), this;
  235. if (t.beforeSerialize && t.beforeSerialize(this, t) === !1) return a("ajaxSubmit: submit aborted via beforeSerialize callback"), this;
  236. var p = t.traditional;
  237. void 0 === p && (p = e.ajaxSettings.traditional);
  238. var d, h = [],
  239. v = this.formToArray(t.semantic, h);
  240. if (t.data && (t.extraData = t.data, d = e.param(t.data, p)), t.beforeSubmit && t.beforeSubmit(v, this, t) === !1) return a("ajaxSubmit: submit aborted via beforeSubmit callback"), this;
  241. if (this.trigger("form-submit-validate", [v, this, t, m]), m.veto) return a("ajaxSubmit: submit vetoed via form-submit-validate trigger"), this;
  242. var g = e.param(v, p);
  243. d && (g = g ? g + "&" + d : d), "GET" == t.type.toUpperCase() ? (t.url += (t.url.indexOf("?") >= 0 ? "&" : "?") + g, t.data = null) : t.data = g;
  244. var x = [];
  245. if (t.resetForm && x.push(function () {
  246. f.resetForm()
  247. }), t.clearForm && x.push(function () {
  248. f.clearForm(t.includeHidden)
  249. }), !t.dataType && t.target) {
  250. var b = t.success || function () {};
  251. x.push(function (r) {
  252. var a = t.replaceTarget ? "replaceWith" : "html";
  253. e(t.target)[a](r).each(b, arguments)
  254. })
  255. } else t.success && x.push(t.success);
  256. if (t.success = function (e, r, a) {
  257. for (var n = t.context || this, i = 0, o = x.length; o > i; i++) x[i].apply(n, [e, r, a || f, f])
  258. }, t.error) {
  259. var y = t.error;
  260. t.error = function (e, r, a) {
  261. var n = t.context || this;
  262. y.apply(n, [e, r, a, f])
  263. }
  264. }
  265. if (t.complete) {
  266. var T = t.complete;
  267. t.complete = function (e, r) {
  268. var a = t.context || this;
  269. T.apply(a, [e, r, f])
  270. }
  271. }
  272. var j = e("input[type=file]:enabled", this).filter(function () {
  273. return "" !== e(this).val()
  274. }),
  275. w = j.length > 0,
  276. S = "multipart/form-data",
  277. D = f.attr("enctype") == S || f.attr("encoding") == S,
  278. k = n.fileapi && n.formdata;
  279. a("fileAPI :" + k);
  280. var A, L = (w || D) && !k;
  281. t.iframe !== !1 && (t.iframe || L) ? t.closeKeepAlive ? e.get(t.closeKeepAlive, function () {
  282. A = s(v)
  283. }) : A = s(v) : A = (w || D) && k ? o(v) : e.ajax(t), f.removeData("jqxhr").data("jqxhr", A);
  284. for (var E = 0; h.length > E; E++) h[E] = null;
  285. return this.trigger("form-submit-notify", [this, t]), this
  286. }, e.fn.ajaxForm = function (n) {
  287. if (n = n || {}, n.delegation = n.delegation && e.isFunction(e.fn.on), !n.delegation && 0 === this.length) {
  288. var i = {
  289. s: this.selector,
  290. c: this.context
  291. };
  292. return !e.isReady && i.s ? (a("DOM not ready, queuing ajaxForm"), e(function () {
  293. e(i.s, i.c).ajaxForm(n)
  294. }), this) : (a("terminating; zero elements found by selector" + (e.isReady ? "" : " (DOM not ready)")), this)
  295. }
  296. return n.delegation ? (e(document).off("submit.form-plugin", this.selector, t).off("click.form-plugin", this.selector, r).on("submit.form-plugin", this.selector, n, t).on("click.form-plugin", this.selector, n, r), this) : this.ajaxFormUnbind().bind("submit.form-plugin", n, t).bind("click.form-plugin", n, r)
  297. }, e.fn.ajaxFormUnbind = function () {
  298. return this.unbind("submit.form-plugin click.form-plugin")
  299. }, e.fn.formToArray = function (t, r) {
  300. var a = [];
  301. if (0 === this.length) return a;
  302. var i = this[0],
  303. o = t ? i.getElementsByTagName("*") : i.elements;
  304. if (!o) return a;
  305. var s, u, l, c, f, m, p;
  306. for (s = 0, m = o.length; m > s; s++)
  307. if (f = o[s], l = f.name, l && !f.disabled)
  308. if (t && i.clk && "image" == f.type) i.clk == f && (a.push({
  309. name: l,
  310. value: e(f).val(),
  311. type: f.type
  312. }), a.push({
  313. name: l + ".x",
  314. value: i.clk_x
  315. }, {
  316. name: l + ".y",
  317. value: i.clk_y
  318. }));
  319. else if (c = e.fieldValue(f, !0), c && c.constructor == Array)
  320. for (r && r.push(f), u = 0, p = c.length; p > u; u++) a.push({
  321. name: l,
  322. value: c[u]
  323. });
  324. else if (n.fileapi && "file" == f.type) {
  325. r && r.push(f);
  326. var d = f.files;
  327. if (d.length)
  328. for (u = 0; d.length > u; u++) a.push({
  329. name: l,
  330. value: d[u],
  331. type: f.type
  332. });
  333. else a.push({
  334. name: l,
  335. value: "",
  336. type: f.type
  337. })
  338. } else null !== c && c !== void 0 && (r && r.push(f), a.push({
  339. name: l,
  340. value: c,
  341. type: f.type,
  342. required: f.required
  343. }));
  344. if (!t && i.clk) {
  345. var h = e(i.clk),
  346. v = h[0];
  347. l = v.name, l && !v.disabled && "image" == v.type && (a.push({
  348. name: l,
  349. value: h.val()
  350. }), a.push({
  351. name: l + ".x",
  352. value: i.clk_x
  353. }, {
  354. name: l + ".y",
  355. value: i.clk_y
  356. }))
  357. }
  358. return a
  359. }, e.fn.formSerialize = function (t) {
  360. return e.param(this.formToArray(t))
  361. }, e.fn.fieldSerialize = function (t) {
  362. var r = [];
  363. return this.each(function () {
  364. var a = this.name;
  365. if (a) {
  366. var n = e.fieldValue(this, t);
  367. if (n && n.constructor == Array)
  368. for (var i = 0, o = n.length; o > i; i++) r.push({
  369. name: a,
  370. value: n[i]
  371. });
  372. else null !== n && n !== void 0 && r.push({
  373. name: this.name,
  374. value: n
  375. })
  376. }
  377. }), e.param(r)
  378. }, e.fn.fieldValue = function (t) {
  379. for (var r = [], a = 0, n = this.length; n > a; a++) {
  380. var i = this[a],
  381. o = e.fieldValue(i, t);
  382. null === o || void 0 === o || o.constructor == Array && !o.length || (o.constructor == Array ? e.merge(r, o) : r.push(o))
  383. }
  384. return r
  385. }, e.fieldValue = function (t, r) {
  386. var a = t.name,
  387. n = t.type,
  388. i = t.tagName.toLowerCase();
  389. if (void 0 === r && (r = !0), r && (!a || t.disabled || "reset" == n || "button" == n || ("checkbox" == n || "radio" == n) && !t.checked || ("submit" == n || "image" == n) && t.form && t.form.clk != t || "select" == i && -1 == t.selectedIndex)) return null;
  390. if ("select" == i) {
  391. var o = t.selectedIndex;
  392. if (0 > o) return null;
  393. for (var s = [], u = t.options, l = "select-one" == n, c = l ? o + 1 : u.length, f = l ? o : 0; c > f; f++) {
  394. var m = u[f];
  395. if (m.selected) {
  396. var p = m.value;
  397. if (p || (p = m.attributes && m.attributes.value && !m.attributes.value.specified ? m.text : m.value), l) return p;
  398. s.push(p)
  399. }
  400. }
  401. return s
  402. }
  403. return e(t).val()
  404. }, e.fn.clearForm = function (t) {
  405. return this.each(function () {
  406. e("input,select,textarea", this).clearFields(t)
  407. })
  408. }, e.fn.clearFields = e.fn.clearInputs = function (t) {
  409. var r = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i;
  410. return this.each(function () {
  411. var a = this.type,
  412. n = this.tagName.toLowerCase();
  413. r.test(a) || "textarea" == n ? this.value = "" : "checkbox" == a || "radio" == a ? this.checked = !1 : "select" == n ? this.selectedIndex = -1 : "file" == a ? /MSIE/.test(navigator.userAgent) ? e(this).replaceWith(e(this).clone(!0)) : e(this).val("") : t && (t === !0 && /hidden/.test(a) || "string" == typeof t && e(this).is(t)) && (this.value = "")
  414. })
  415. }, e.fn.resetForm = function () {
  416. return this.each(function () {
  417. ("function" == typeof this.reset || "object" == typeof this.reset && !this.reset.nodeType) && this.reset()
  418. })
  419. }, e.fn.enable = function (e) {
  420. return void 0 === e && (e = !0), this.each(function () {
  421. this.disabled = !e
  422. })
  423. }, e.fn.selected = function (t) {
  424. return void 0 === t && (t = !0), this.each(function () {
  425. var r = this.type;
  426. if ("checkbox" == r || "radio" == r) this.checked = t;
  427. else if ("option" == this.tagName.toLowerCase()) {
  428. var a = e(this).parent("select");
  429. t && a[0] && "select-one" == a[0].type && a.find("option").selected(!1), this.selected = t
  430. }
  431. })
  432. }, e.fn.ajaxSubmit.debug = !1
  433. })("undefined" != typeof jQuery ? jQuery : window.Zepto);
  434. })