From cbb86d72f1c7a5ab4030a34a8e4c1b9e8688097b Mon Sep 17 00:00:00 2001 From: sxw Date: Wed, 5 Aug 2015 20:01:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E4=BA=86validator=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8CremoteCSRF->remote?= =?UTF-8?q?.=E6=8A=8A=E5=8E=9F=E7=94=9F=E7=9A=84remote=E6=94=B9=E6=88=90?= =?UTF-8?q?=E4=BA=86remotex=E3=80=82=E3=80=82=E3=80=82=20[ci=20skip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/oj/account/register.js | 8 +- static/src/js/config.js | 2 +- .../js/lib/formValidation/validator/remote.js | 144 +++-------------- .../formValidation/validator/remoteCSRF.js | 46 ------ .../lib/formValidation/validator/remotex.js | 146 ++++++++++++++++++ static/src/js/utils/validation.js | 2 +- 6 files changed, 175 insertions(+), 173 deletions(-) delete mode 100644 static/src/js/lib/formValidation/validator/remoteCSRF.js create mode 100644 static/src/js/lib/formValidation/validator/remotex.js diff --git a/static/src/js/app/oj/account/register.js b/static/src/js/app/oj/account/register.js index b9d3468e..a7a3ea12 100644 --- a/static/src/js/app/oj/account/register.js +++ b/static/src/js/app/oj/account/register.js @@ -18,8 +18,10 @@ require(["jquery", "bs_alert", "csrf", "validation"], function($, bs_alert, csrf max: 30, message: '用户名长度必须在3到30位之间' }, - usernameCheck:{ - message: '用户名已存在' + remote: { + message: "用户名已存在", + url: "/api/username_check/", + field: 'username' } } }, @@ -64,7 +66,7 @@ require(["jquery", "bs_alert", "csrf", "validation"], function($, bs_alert, csrf emailAddress: { message: "请填写有效的邮箱地址" }, - remoteCSRF: { + remote: { message: "您已经注册过了", url: "/api/email_check/", field: 'email' diff --git a/static/src/js/config.js b/static/src/js/config.js index dc8b37c2..67bb9b66 100644 --- a/static/src/js/config.js +++ b/static/src/js/config.js @@ -28,7 +28,7 @@ var require = { "validator/integer": "lib/formValidation/validator/integer", "validator/between": "lib/formValidation/validator/between", "validator/confirm":"lib/formValidation/validator/confirm", - "validator/remoteCSRF":"lib/formValidation/validator/remoteCSRF", + "validator/remote":"lib/formValidation/validator/remote", "validator/emailAddress":"lib/formValidation/validator/emailAddress", //富文本编辑器 不要直接使用,而是使用上面的editor simditor: "lib/simditor/simditor", diff --git a/static/src/js/lib/formValidation/validator/remote.js b/static/src/js/lib/formValidation/validator/remote.js index b0ba1af2..e7f8d024 100755 --- a/static/src/js/lib/formValidation/validator/remote.js +++ b/static/src/js/lib/formValidation/validator/remote.js @@ -1,146 +1,46 @@ /** * remote validator - * - * @link http://formvalidation.io/validators/remote/ - * @author https://twitter.com/nghuuphuoc - * @copyright (c) 2013 - 2015 Nguyen Huu Phuoc - * @license http://formvalidation.io/license/ */ - (function(root, factory) { "use strict"; // AMD module is defined if (typeof define === "function" && define.amd) { - define("validator/remote", ["jquery", "base"], factory); + define("validator/remote", ["jquery", "base", "csrf"], factory); } else { // planted over the root! factory(root.jQuery, root.FormValidation); } - -}(this, function ($, FormValidation) { +}(this, function ($, FormValidation, csrfHeader) { FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, { 'en_US': { remote: { - 'default': 'Please enter a valid value' + 'default': '' } } }); - FormValidation.Validator.remote = { - html5Attributes: { - message: 'message', - name: 'name', - type: 'type', - url: 'url', - data: 'data', - delay: 'delay' - }, - - /** - * Destroy the timer when destroying the bootstrapValidator (using validator.destroy() method) - */ - destroy: function(validator, $field, options) { - var ns = validator.getNamespace(), - timer = $field.data(ns + '.remote.timer'); - if (timer) { - clearTimeout(timer); - $field.removeData(ns + '.remote.timer'); - } - }, - - /** - * Request a remote server to check the input value - * - * @param {FormValidation.Base} validator Plugin instance - * @param {jQuery} $field Field element - * @param {Object} options Can consist of the following keys: - * - url {String|Function} - * - type {String} [optional] Can be GET or POST (default) - * - data {Object|Function} [optional]: By default, it will take the value - * { - * : - * } - * - delay - * - name {String} [optional]: Override the field name for the request. - * - message: The invalid message - * - headers: Additional headers - * @returns {Deferred} - */ validate: function(validator, $field, options) { - var ns = validator.getNamespace(), - value = validator.getFieldValue($field, 'remote'), - dfd = new $.Deferred(); - if (value === '') { - dfd.resolve($field, 'remote', { valid: true }); - return dfd; - } - - var name = $field.attr('data-' + ns + '-field'), - data = options.data || {}, - url = options.url, - type = options.type || 'GET', - headers = options.headers || {}; - - // Support dynamic data - if ('function' === typeof data) { - data = data.call(this, validator); - } - - // Parse string data from HTML5 attribute - if ('string' === typeof data) { - data = JSON.parse(data); - } - - // Support dynamic url - if ('function' === typeof url) { - url = url.call(this, validator); - } - - data[options.name || name] = value; - function runCallback() { - var xhr = $.ajax({ - type: type, - headers: headers, - url: url, - dataType: 'json', - data: data - }); - - xhr - .success(function(response) { - response.valid = response.valid === true || response.valid === 'true'; - dfd.resolve($field, 'remote', response); - }) - .error(function(response) { - dfd.resolve($field, 'remote', { - valid: false - }); - }); - - dfd.fail(function() { - xhr.abort(); - }); - - return dfd; - } - - if (options.delay) { - // Since the form might have multiple fields with the same name - // I have to attach the timer to the field element - if ($field.data(ns + '.remote.timer')) { - clearTimeout($field.data(ns + '.remote.timer')); - } - - $field.data(ns + '.remote.timer', setTimeout(runCallback, options.delay)); - return dfd; - } else { - return runCallback(); - } + var dfd = new $.Deferred(), ajaxData = {}; + ajaxData[options.field] = $field.val(); + if ($field.val() === '') + return true; + var url = options.url; + var xhr = $.ajax({ + beforeSend: csrfHeader, + url: url, + dataType: 'json', + data: ajaxData, + method: "post" + }); + xhr.success(function(response) { + dfd.resolve($field, 'remote',{valid:!response.data, message:options.msg}); + }) + .error(function(response) { + dfd.resolve($field, 'remote', {valid: false}); + }); + return dfd; } }; - - - return FormValidation.Validator.remote; })); diff --git a/static/src/js/lib/formValidation/validator/remoteCSRF.js b/static/src/js/lib/formValidation/validator/remoteCSRF.js deleted file mode 100644 index 9cab354f..00000000 --- a/static/src/js/lib/formValidation/validator/remoteCSRF.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * remoteCSRF validator - */ -(function(root, factory) { - - "use strict"; - - // AMD module is defined - if (typeof define === "function" && define.amd) { - define("validator/remoteCSRF", ["jquery", "base", "csrf"], factory); - } else { - // planted over the root! - factory(root.jQuery, root.FormValidation); - } -}(this, function ($, FormValidation, csrfHeader) { - FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, { - 'en_US': { - remoteCSRF: { - 'default': '' - } - } - }); - FormValidation.Validator.remoteCSRF = { - validate: function(validator, $field, options) { - var dfd = new $.Deferred(), ajaxData = {}; - ajaxData[options.field] = $field.val(); - if ($field.val() === '') - return true; - var url = options.url; - var xhr = $.ajax({ - beforeSend: csrfHeader, - url: url, - dataType: 'json', - data: ajaxData, - method: "post" - }); - xhr.success(function(response) { - dfd.resolve($field, 'remoteCSRF',{valid:!response.data, message:options.msg}); - }) - .error(function(response) { - dfd.resolve($field, 'remoteCSRF', {valid: false}); - }); - return dfd; - } - }; -})); diff --git a/static/src/js/lib/formValidation/validator/remotex.js b/static/src/js/lib/formValidation/validator/remotex.js new file mode 100644 index 00000000..b0ba1af2 --- /dev/null +++ b/static/src/js/lib/formValidation/validator/remotex.js @@ -0,0 +1,146 @@ +/** + * remote validator + * + * @link http://formvalidation.io/validators/remote/ + * @author https://twitter.com/nghuuphuoc + * @copyright (c) 2013 - 2015 Nguyen Huu Phuoc + * @license http://formvalidation.io/license/ + */ + +(function(root, factory) { + + "use strict"; + + // AMD module is defined + if (typeof define === "function" && define.amd) { + define("validator/remote", ["jquery", "base"], factory); + } else { + // planted over the root! + factory(root.jQuery, root.FormValidation); + } + +}(this, function ($, FormValidation) { + FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, { + 'en_US': { + remote: { + 'default': 'Please enter a valid value' + } + } + }); + + FormValidation.Validator.remote = { + html5Attributes: { + message: 'message', + name: 'name', + type: 'type', + url: 'url', + data: 'data', + delay: 'delay' + }, + + /** + * Destroy the timer when destroying the bootstrapValidator (using validator.destroy() method) + */ + destroy: function(validator, $field, options) { + var ns = validator.getNamespace(), + timer = $field.data(ns + '.remote.timer'); + if (timer) { + clearTimeout(timer); + $field.removeData(ns + '.remote.timer'); + } + }, + + /** + * Request a remote server to check the input value + * + * @param {FormValidation.Base} validator Plugin instance + * @param {jQuery} $field Field element + * @param {Object} options Can consist of the following keys: + * - url {String|Function} + * - type {String} [optional] Can be GET or POST (default) + * - data {Object|Function} [optional]: By default, it will take the value + * { + * : + * } + * - delay + * - name {String} [optional]: Override the field name for the request. + * - message: The invalid message + * - headers: Additional headers + * @returns {Deferred} + */ + validate: function(validator, $field, options) { + var ns = validator.getNamespace(), + value = validator.getFieldValue($field, 'remote'), + dfd = new $.Deferred(); + if (value === '') { + dfd.resolve($field, 'remote', { valid: true }); + return dfd; + } + + var name = $field.attr('data-' + ns + '-field'), + data = options.data || {}, + url = options.url, + type = options.type || 'GET', + headers = options.headers || {}; + + // Support dynamic data + if ('function' === typeof data) { + data = data.call(this, validator); + } + + // Parse string data from HTML5 attribute + if ('string' === typeof data) { + data = JSON.parse(data); + } + + // Support dynamic url + if ('function' === typeof url) { + url = url.call(this, validator); + } + + data[options.name || name] = value; + function runCallback() { + var xhr = $.ajax({ + type: type, + headers: headers, + url: url, + dataType: 'json', + data: data + }); + + xhr + .success(function(response) { + response.valid = response.valid === true || response.valid === 'true'; + dfd.resolve($field, 'remote', response); + }) + .error(function(response) { + dfd.resolve($field, 'remote', { + valid: false + }); + }); + + dfd.fail(function() { + xhr.abort(); + }); + + return dfd; + } + + if (options.delay) { + // Since the form might have multiple fields with the same name + // I have to attach the timer to the field element + if ($field.data(ns + '.remote.timer')) { + clearTimeout($field.data(ns + '.remote.timer')); + } + + $field.data(ns + '.remote.timer', setTimeout(runCallback, options.delay)); + return dfd; + } else { + return runCallback(); + } + } + }; + + + return FormValidation.Validator.remote; +})); diff --git a/static/src/js/utils/validation.js b/static/src/js/utils/validation.js index 45da8f56..191d5850 100644 --- a/static/src/js/utils/validation.js +++ b/static/src/js/utils/validation.js @@ -9,7 +9,7 @@ define("validation", 'validator/integer', 'validator/between', 'validator/confirm', - 'validator/remoteCSRF', + 'validator/remote', 'validator/emailAddress'], function () { }); \ No newline at end of file