Browse Source

Merge branch 'q-state-debounce'

Phuoc Nguyen 11 years ago
parent
commit
9da1ea2afb
2 changed files with 35 additions and 17 deletions
  1. 4 2
      demo/remote.html
  2. 31 15
      src/js/validator/remote.js

+ 4 - 2
demo/remote.html

@@ -110,7 +110,8 @@ $(document).ready(function() {
                     },
                     remote: {
                         url: 'remote.php',
-                        message: 'The username is not available'
+                        message: 'The username is not available',
+                        debounceDelay: 1000
                     },
                     different: {
                         field: 'password',
@@ -128,7 +129,8 @@ $(document).ready(function() {
                     },
                     remote: {
                         url: 'remote.php',
-                        message: 'The email is not available'
+                        message: 'The email is not available',
+                        debounceDelay: 1000
                     }
                 }
             },

+ 31 - 15
src/js/validator/remote.js

@@ -8,9 +8,12 @@
             message: 'message',
             name: 'name',
             type: 'type',
-            url: 'url'
+            url: 'url',
+            debounceDelay: 'debounceDelay'
         },
 
+        _timer: [],
+
         /**
          * Request a remote server to check the input value
          *
@@ -53,22 +56,35 @@
             data[options.name || name] = value;
 
             var dfd = new $.Deferred();
-            var xhr = $.ajax({
-                type: type,
-                headers: headers,
-                url: url,
-                dataType: 'json',
-                data: data
-            });
-            xhr.then(function(response) {
-                dfd.resolve($field, 'remote', response.valid === true || response.valid === 'true', response.message ? response.message : null);
-            });
+            
+            if (options.debounceDelay) {
+                if(this._timer[name]) {
+                    clearTimeout(this._timer[name]);
+                }
+                this._timer[name] = setTimeout(runCallback, options.debounceDelay);
+                return dfd;
+            }
+            else
+                return runCallback();
 
-            dfd.fail(function() {
-                xhr.abort();
-            });
+            function runCallback() {
+                var xhr = $.ajax({
+                    type: type,
+                    headers: headers,
+                    url: url,
+                    dataType: 'json',
+                    data: data
+                });
+                xhr.then(function (response) {
+                    dfd.resolve($field, 'remote', response.valid === true || response.valid === 'true', response.message ? response.message : null);
+                });
 
-            return dfd;
+                dfd.fail(function () {
+                    xhr.abort();
+                });
+
+                return dfd;
+            }
         }
     };
 }(window.jQuery));