Browse Source

Merge branch 'android' into dev

Conflicts:
	jquery.inputmask.js
Robin Herbots 14 years ago
parent
commit
c3dcc6bef5
1 changed files with 35 additions and 26 deletions
  1. 35 26
      jquery.inputmask.js

+ 35 - 26
jquery.inputmask.js

@@ -3,7 +3,7 @@ Input Mask plugin for jquery
 http://github.com/RobinHerbots/jquery.inputmask
 Copyright (c) 2010 Robin Herbots
 Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-Version: 0.4.6e - dev
+Version: 0.4.7 - dev
  
 This plugin is based on the masked input plugin written by Josh Bush (digitalbush.com)
 */
@@ -55,8 +55,9 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
         $.fn.inputmask = function(fn, options) {
             var opts = $.extend(true, {}, $.inputmask.defaults, options);
             var pasteEventName = $.browser.msie ? 'paste.inputmask' : 'input.inputmask';
-            var iphone =  navigator.userAgent.match(/iphone/i) != null;
-            var android =  navigator.userAgent.match(/android/i) != null;
+
+            var iphone = navigator.userAgent.match(/iphone/i) != null;
+            var android = navigator.userAgent.match(/android/i) != null;
 
             var _val = $.inputmask.val;
             if (opts.patch_val && $.fn.val.inputmaskpatch != true) {
@@ -430,32 +431,36 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
             }
 
             function caret(input, begin, end) {
-                if (input.length == 0) return;
+                var npt = input.jquery && input.length > 0 ? input[0] : input;
                 if (typeof begin == 'number') {
                     end = (typeof end == 'number') ? end : begin;
                     if (opts.insertMode == false && begin == end) end++; //set visualization for insert/overwrite mode
-                    return input.each(function() {
-                        var self = this;
-                        if (self.setSelectionRange) {
-                            self.setSelectionRange(begin, end);
-                        } else if (self.createTextRange) {
-                            var range = self.createTextRange();
-                            range.collapse(true);
-                            range.moveEnd('character', end);
-                            range.moveStart('character', begin);
-                            range.select();
-                        }
-                    });
+                    if (npt.setSelectionRange) {
+                        npt.setSelectionRange(begin, end);
+                    } else if (npt.createTextRange) {
+                        var range = npt.createTextRange();
+                        range.collapse(true);
+                        range.moveEnd('character', end);
+                        range.moveStart('character', begin);
+                        range.select();
+                    }
+                    npt.focus();
+                    //setSelectionRange in android is buggy - so we manually track the position
+                    if(android) input.data('inputmask', $.extend(input.data('inputmask'), { caretpos: { begin: begin, end: end} }));
                 } else {
-                    if (input[0].setSelectionRange) {
-                        begin = input[0].selectionStart;
-                        end = input[0].selectionEnd;
-                    } else if (document.selection && document.selection.createRange) {
-                        var range = document.selection.createRange();
-                        begin = 0 - range.duplicate().moveStart('character', -100000);
-                        end = begin + range.text.length;
+                	var caretpos = android ? input.data('inputmask').caretpos : null;
+                	if(caretpos == null){
+                    	if (npt.setSelectionRange) {
+                        	begin = npt.selectionStart;
+                        	end = npt.selectionEnd;
+                    	} else if (document.selection && document.selection.createRange) {
+                        	var range = document.selection.createRange();
+                        	begin = 0 - range.duplicate().moveStart('character', -100000);
+                        	end = begin + range.text.length;
+                    	}
+                    	caretpos = { begin: begin, end: end };
                     }
-                    return { begin: begin, end: end };
+                    return caretpos;
                 }
             };
 
@@ -515,6 +520,7 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
                             _val.call(input, '');
                     }).bind("click.inputmask", function() {
                         var input = $(this);
+                        if(android) input.data('inputmask', $.extend(input.data('inputmask'), { caretpos: null })); //android workaround - see caret fn
                         setTimeout(function() {
                             var selectedCaret = caret(input);
                             if (selectedCaret.begin == selectedCaret.end) {
@@ -619,9 +625,12 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
 
                     //Safari 5.1.x - modal dialog fires keypress twice workaround
                     input.data('inputmask', $.extend(input.data('inputmask'), { skipKeyPressEvent: false }));
-                    
-                    var pos = caret(input);
+
                     var k = e.keyCode;
+                    if(android && (k == opts.keyCode.RIGHT || k == opts.keyCode.LEFT)) //android workaround - see caret fn
+						input.data('inputmask', $.extend(input.data('inputmask'), { caretpos: null }));
+
+					var pos = caret(input);
                     ignore = (k < 16 || (k > 16 && k < 32) || (k > 32 && k < 41));
 
                     //delete selection before proceeding