浏览代码

Add option to emailAddress validator to allow multiple email addresses, separated by commas or semicolons.

Kenny Evitt 11 年之前
父节点
当前提交
107415dece

+ 1 - 1
dist/css/bootstrapValidator.min.css

@@ -2,7 +2,7 @@
  * BootstrapValidator (http://bootstrapvalidator.com)
  * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
  *
- * @version     v0.5.1-dev, built on 2014-08-14 3:41:09 PM
+ * @version     v0.5.1-dev, built on 2014-08-14 3:52:46 PM
  * @author      https://twitter.com/nghuuphuoc
  * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
  * @license     MIT

+ 48 - 2
dist/js/bootstrapValidator.js

@@ -2,7 +2,7 @@
  * BootstrapValidator (http://bootstrapvalidator.com)
  * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
  *
- * @version     v0.5.1-dev, built on 2014-08-14 3:41:09 PM
+ * @version     v0.5.1-dev, built on 2014-08-14 3:52:46 PM
  * @author      https://twitter.com/nghuuphuoc
  * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
  * @license     MIT
@@ -2530,6 +2530,7 @@
          * @param {BootstrapValidator} validator Validate plugin instance
          * @param {jQuery} $field Field element
          * @param {Object} [options]
+         * - allowMultiple: Allow multiple email addresses, separated by a comma or semicolon; default is false.
          * @returns {Boolean}
          */
         validate: function(validator, $field, options) {
@@ -2541,9 +2542,54 @@
             // Email address regular expression
             // http://stackoverflow.com/questions/46155/validate-email-address-in-javascript
             var emailRegExp = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
-            return emailRegExp.test(value);
+
+            var allowMultiple = options.allowMultiple === true || options.allowMultiple === 'true';
+
+            if (allowMultiple) {
+                return splitEmailAddresses(value).reduce( function(previousValue, currentValue, index, array) {
+                    return previousValue && emailRegExp.test(currentValue);
+                },
+                true);
+            }
+            else {
+                return emailRegExp.test(value);
+            }
         }
     };
+
+    function splitEmailAddresses(emailAddresses) {
+        var quotedFragments = emailAddresses.split(/"/),
+            quotedFragmentCount = quotedFragments.length,
+            emailAddressArray = [],
+            nextEmailAddress = "";
+
+        for (var i = 0; i < quotedFragmentCount; i++) {
+            if (i % 2 === 0) {
+                var splitEmailAddressFragments = quotedFragments[i].split(/[,;]/);
+                var splitEmailAddressFragmentCount = splitEmailAddressFragments.length;
+
+                if (splitEmailAddressFragmentCount === 1){
+                    nextEmailAddress += splitEmailAddressFragments[0];
+                }
+                else {
+                    emailAddressArray.push(nextEmailAddress + splitEmailAddressFragments[0]);
+
+                    for (var j = 1; j < splitEmailAddressFragmentCount - 1; j++) {
+                        emailAddressArray.push(splitEmailAddressFragments[j]);
+                    }
+
+                    nextEmailAddress = splitEmailAddressFragments[splitEmailAddressFragmentCount - 1];
+                }
+            }
+            else {
+                nextEmailAddress += '"' + quotedFragments[i] + '"';
+            }
+        }
+
+        emailAddressArray.push(nextEmailAddress);
+
+        return emailAddressArray;
+    }
 }(window.jQuery));
 ;(function($) {
     $.fn.bootstrapValidator.i18n.file = $.extend($.fn.bootstrapValidator.i18n.file || {}, {

文件差异内容过多而无法显示
+ 3 - 3
dist/js/bootstrapValidator.min.js


+ 47 - 1
src/js/validator/emailAddress.js

@@ -14,6 +14,7 @@
          * @param {BootstrapValidator} validator Validate plugin instance
          * @param {jQuery} $field Field element
          * @param {Object} [options]
+         * - allowMultiple: Allow multiple email addresses, separated by a comma or semicolon; default is false.
          * @returns {Boolean}
          */
         validate: function(validator, $field, options) {
@@ -25,7 +26,52 @@
             // Email address regular expression
             // http://stackoverflow.com/questions/46155/validate-email-address-in-javascript
             var emailRegExp = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
-            return emailRegExp.test(value);
+
+            var allowMultiple = options.allowMultiple === true || options.allowMultiple === 'true';
+
+            if (allowMultiple) {
+                return splitEmailAddresses(value).reduce( function(previousValue, currentValue, index, array) {
+                    return previousValue && emailRegExp.test(currentValue);
+                },
+                true);
+            }
+            else {
+                return emailRegExp.test(value);
+            }
         }
     };
+
+    function splitEmailAddresses(emailAddresses) {
+        var quotedFragments = emailAddresses.split(/"/),
+            quotedFragmentCount = quotedFragments.length,
+            emailAddressArray = [],
+            nextEmailAddress = "";
+
+        for (var i = 0; i < quotedFragmentCount; i++) {
+            if (i % 2 === 0) {
+                var splitEmailAddressFragments = quotedFragments[i].split(/[,;]/);
+                var splitEmailAddressFragmentCount = splitEmailAddressFragments.length;
+
+                if (splitEmailAddressFragmentCount === 1){
+                    nextEmailAddress += splitEmailAddressFragments[0];
+                }
+                else {
+                    emailAddressArray.push(nextEmailAddress + splitEmailAddressFragments[0]);
+
+                    for (var j = 1; j < splitEmailAddressFragmentCount - 1; j++) {
+                        emailAddressArray.push(splitEmailAddressFragments[j]);
+                    }
+
+                    nextEmailAddress = splitEmailAddressFragments[splitEmailAddressFragmentCount - 1];
+                }
+            }
+            else {
+                nextEmailAddress += '"' + quotedFragments[i] + '"';
+            }
+        }
+
+        emailAddressArray.push(nextEmailAddress);
+
+        return emailAddressArray;
+    }
 }(window.jQuery));

+ 41 - 9
test/spec.js

@@ -2321,14 +2321,14 @@ describe('ean', function() {
         expect(this.bv.isValidField('ean')).toEqual(false);
     });
 });
-
+
 describe('emailAddress', function() {
     beforeEach(function () {
         $([
             '<form class="form-horizontal" id="emailAddressForm">',
                 '<div id="msg"></div>',
                 '<div class="form-group">',
-                    '<input type="text" name="email-address" data-bv-emailaddress />',
+                    '<input type="text" name="email-address-or-addresses" data-bv-emailaddress />',
                 '</div>',
             '</form>'
         ].join('\n')).appendTo('body');
@@ -2336,7 +2336,7 @@ describe('emailAddress', function() {
         $('#emailAddressForm').bootstrapValidator();
 
         this.bv = $('#emailAddressForm').data('bootstrapValidator');
-        this.$emailAddress = this.bv.getFieldElements('email-address');
+        this.$emailAddressOrAddresses = this.bv.getFieldElements('email-address-or-addresses');
     });
 
     afterEach(function () {
@@ -2368,27 +2368,59 @@ describe('emailAddress', function() {
         'this\ still\"not\\allowed@example.com'
     ];
 
-    it('Valid email addresses', function() {
+    var validMultipleEmailAddresses = [
+        'niceandsimple@example.com,very.common@example.com',
+        'niceandsimple@example.com;very.common@example.com'
+    ];
+
+    var invalidMultipleEmailAddresses = [
+        'niceandsimple@example.com+very.common@example.com',
+        'niceandsimple@example.com|very.common@example.com'
+    ];
+
+    it('Valid email addresses (allowMultiple=false)', function() {
         var me = this;
         $.each(validEmailAddresses, function(index, emailAddress) {
             me.bv.resetForm();
-            me.$emailAddress.val(emailAddress);
+            me.$emailAddressOrAddresses.val(emailAddress);
             me.bv.validate();
             expect(me.bv.isValid()).toBeTruthy();
         });
     });
 
-    it('Invalid email addresses', function() {
+    it('Invalid email addresses (allowMultiple=false)', function() {
         var me = this;
-        $.each(invalidEmailAddresses, function(index, emailAddress) {
+        $.each(invalidEmailAddresses.concat(validMultipleEmailAddresses), function(index, emailAddress) {
             me.bv.resetForm();
-            me.$emailAddress.val(emailAddress);
+            me.$emailAddressOrAddresses.val(emailAddress);
             me.bv.validate();
             expect(me.bv.isValid()).toEqual(false);
         });
     });
-});
 
+    it('Valid email addresses (allowMultiple=true)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'allowMultiple', true);
+        $.each(validEmailAddresses.concat(validMultipleEmailAddresses), function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toBeTruthy();
+        });
+    });
+
+    it('Invalid email addresses (allowMultiple=true)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'allowMultiple', true);
+        $.each(invalidEmailAddresses.concat(invalidMultipleEmailAddresses), function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toEqual(false);
+        });
+    });
+});
+
 function greaterThanCompare() {
     var compareTo = $('#greaterThanForm').find('[name="minAge"]').val();
     $('#msg').html('greaterThanCompare() called; compare to ' + compareTo);

+ 39 - 7
test/spec/validator/emailAddress.js

@@ -4,7 +4,7 @@ describe('emailAddress', function() {
             '<form class="form-horizontal" id="emailAddressForm">',
                 '<div id="msg"></div>',
                 '<div class="form-group">',
-                    '<input type="text" name="email-address" data-bv-emailaddress />',
+                    '<input type="text" name="email-address-or-addresses" data-bv-emailaddress />',
                 '</div>',
             '</form>'
         ].join('\n')).appendTo('body');
@@ -12,7 +12,7 @@ describe('emailAddress', function() {
         $('#emailAddressForm').bootstrapValidator();
 
         this.bv = $('#emailAddressForm').data('bootstrapValidator');
-        this.$emailAddress = this.bv.getFieldElements('email-address');
+        this.$emailAddressOrAddresses = this.bv.getFieldElements('email-address-or-addresses');
     });
 
     afterEach(function () {
@@ -44,21 +44,53 @@ describe('emailAddress', function() {
         'this\ still\"not\\allowed@example.com'
     ];
 
-    it('Valid email addresses', function() {
+    var validMultipleEmailAddresses = [
+        'niceandsimple@example.com,very.common@example.com',
+        'niceandsimple@example.com;very.common@example.com'
+    ];
+
+    var invalidMultipleEmailAddresses = [
+        'niceandsimple@example.com+very.common@example.com',
+        'niceandsimple@example.com|very.common@example.com'
+    ];
+
+    it('Valid email addresses (allowMultiple=false)', function() {
         var me = this;
         $.each(validEmailAddresses, function(index, emailAddress) {
             me.bv.resetForm();
-            me.$emailAddress.val(emailAddress);
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toBeTruthy();
+        });
+    });
+
+    it('Invalid email addresses (allowMultiple=false)', function() {
+        var me = this;
+        $.each(invalidEmailAddresses.concat(validMultipleEmailAddresses), function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
+            me.bv.validate();
+            expect(me.bv.isValid()).toEqual(false);
+        });
+    });
+
+    it('Valid email addresses (allowMultiple=true)', function() {
+        var me = this;
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'allowMultiple', true);
+        $.each(validEmailAddresses.concat(validMultipleEmailAddresses), function(index, emailAddress) {
+            me.bv.resetForm();
+            me.$emailAddressOrAddresses.val(emailAddress);
             me.bv.validate();
             expect(me.bv.isValid()).toBeTruthy();
         });
     });
 
-    it('Invalid email addresses', function() {
+    it('Invalid email addresses (allowMultiple=true)', function() {
         var me = this;
-        $.each(invalidEmailAddresses, function(index, emailAddress) {
+        me.bv.updateOption('email-address-or-addresses', 'emailAddress', 'allowMultiple', true);
+        $.each(invalidEmailAddresses.concat(invalidMultipleEmailAddresses), function(index, emailAddress) {
             me.bv.resetForm();
-            me.$emailAddress.val(emailAddress);
+            me.$emailAddressOrAddresses.val(emailAddress);
             me.bv.validate();
             expect(me.bv.isValid()).toEqual(false);
         });