Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Fix android issue #85

Closed
wants to merge 1 commit into from

5 participants

@alexandremblah

Fix keydown android issue, do not forget to remove maxlength input attribute

@eliasjunior

Thanks!

@Eonasdan

see this #106

@slavjanin

Thank you, it's works good. But there one bug on Android. If we have phone number in input in format 9999-9999, and when we try to delete number from end to start position with backspace we can to clear only second part of number and cursor moves to the end. And we have to set cursor to the first part of number for clearing other part

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on May 23, 2012
  1. @alexandremblah
This page is out of date. Refresh to see the latest.
Showing with 233 additions and 226 deletions.
  1. +233 −226 src/jquery.maskedinput.js
View
459 src/jquery.maskedinput.js
@@ -1,258 +1,265 @@
/*
- Masked Input plugin for jQuery
- Copyright (c) 2007-@Year Josh Bush (digitalbush.com)
- Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)
- Version: @version
+Masked Input plugin for jQuery
+Copyright (c) 2007-@Year Josh Bush (digitalbush.com)
+Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)
+Version: @version
*/
-(function($) {
- var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask";
- var iPhone = (window.orientation != undefined);
+(function ($) {
+ var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask";
+ var iPhone = (window.orientation != undefined);
+ var isAndroid = navigator.userAgent.toLowerCase().indexOf("android") > -1;
- $.mask = {
- //Predefined character definitions
- definitions: {
- '9': "[0-9]",
- 'a': "[A-Za-z]",
- '*': "[A-Za-z0-9]"
- },
- dataName:"rawMaskFn"
- };
+ $.mask = {
+ //Predefined character definitions
+ definitions: {
+ '9': "[0-9]",
+ 'a': "[A-Za-z]",
+ '*': "[A-Za-z0-9]"
+ },
+ dataName: "rawMaskFn"
+ };
- $.fn.extend({
- //Helper Function for Caret positioning
- caret: function(begin, end) {
- if (this.length == 0) return;
- if (typeof begin == 'number') {
- end = (typeof end == 'number') ? end : begin;
- return this.each(function() {
- if (this.setSelectionRange) {
- this.setSelectionRange(begin, end);
- } else if (this.createTextRange) {
- var range = this.createTextRange();
- range.collapse(true);
- range.moveEnd('character', end);
- range.moveStart('character', begin);
- range.select();
- }
- });
- } else {
- if (this[0].setSelectionRange) {
- begin = this[0].selectionStart;
- end = this[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;
- }
- return { begin: begin, end: end };
- }
- },
- unmask: function() { return this.trigger("unmask"); },
- mask: function(mask, settings) {
- if (!mask && this.length > 0) {
- var input = $(this[0]);
- return input.data($.mask.dataName)();
- }
- settings = $.extend({
- placeholder: "_",
- completed: null
- }, settings);
+ $.fn.extend({
+ //Helper Function for Caret positioning
+ caret: function (begin, end) {
+ if (this.length == 0) return;
+ if (typeof begin == 'number') {
+ end = (typeof end == 'number') ? end : begin;
+ return this.each(function () {
+ if (this.setSelectionRange) {
+ if (isAndroid) {
+ var that = this;
+ setTimeout(function () { that.setSelectionRange(begin, end); }, 0);
+ }
+ else {
+ this.setSelectionRange(begin, end);
+ }
+ } else if (this.createTextRange) {
+ var range = this.createTextRange();
+ range.collapse(true);
+ range.moveEnd('character', end);
+ range.moveStart('character', begin);
+ range.select();
+ }
+ });
+ } else {
+ if (this[0].setSelectionRange) {
+ begin = this[0].selectionStart;
+ end = this[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;
+ }
+ return { begin: begin, end: end };
+ }
+ },
+ unmask: function () { return this.trigger("unmask"); },
+ mask: function (mask, settings) {
+ if (!mask && this.length > 0) {
+ var input = $(this[0]);
+ return input.data($.mask.dataName)();
+ }
+ settings = $.extend({
+ placeholder: "_",
+ completed: null
+ }, settings);
- var defs = $.mask.definitions;
- var tests = [];
- var partialPosition = mask.length;
- var firstNonMaskPos = null;
- var len = mask.length;
+ var defs = $.mask.definitions;
+ var tests = [];
+ var partialPosition = mask.length;
+ var firstNonMaskPos = null;
+ var len = mask.length;
- $.each(mask.split(""), function(i, c) {
- if (c == '?') {
- len--;
- partialPosition = i;
- } else if (defs[c]) {
- tests.push(new RegExp(defs[c]));
- if(firstNonMaskPos==null)
- firstNonMaskPos = tests.length - 1;
- } else {
- tests.push(null);
- }
- });
+ $.each(mask.split(""), function (i, c) {
+ if (c == '?') {
+ len--;
+ partialPosition = i;
+ } else if (defs[c]) {
+ tests.push(new RegExp(defs[c]));
+ if (firstNonMaskPos == null)
+ firstNonMaskPos = tests.length - 1;
+ } else {
+ tests.push(null);
+ }
+ });
- return this.trigger("unmask").each(function() {
- var input = $(this);
- var buffer = $.map(mask.split(""), function(c, i) { if (c != '?') return defs[c] ? settings.placeholder : c });
- var focusText = input.val();
+ return this.trigger("unmask").each(function () {
+ var input = $(this);
+ var buffer = $.map(mask.split(""), function (c, i) { if (c != '?') return defs[c] ? settings.placeholder : c });
+ var focusText = input.val();
- function seekNext(pos) {
- while (++pos <= len && !tests[pos]);
- return pos;
- };
- function seekPrev(pos) {
- while (--pos >= 0 && !tests[pos]);
- return pos;
- };
+ function seekNext(pos) {
+ while (++pos <= len && !tests[pos]);
+ return pos;
+ };
+ function seekPrev(pos) {
+ while (--pos >= 0 && !tests[pos]);
+ return pos;
+ };
- function shiftL(begin,end) {
- if(begin<0)
- return;
- for (var i = begin,j = seekNext(end); i < len; i++) {
- if (tests[i]) {
- if (j < len && tests[i].test(buffer[j])) {
- buffer[i] = buffer[j];
- buffer[j] = settings.placeholder;
- } else
- break;
- j = seekNext(j);
- }
- }
- writeBuffer();
- input.caret(Math.max(firstNonMaskPos, begin));
- };
+ function shiftL(begin, end) {
+ if (begin < 0)
+ return;
+ for (var i = begin, j = seekNext(end); i < len; i++) {
+ if (tests[i]) {
+ if (j < len && tests[i].test(buffer[j])) {
+ buffer[i] = buffer[j];
+ buffer[j] = settings.placeholder;
+ } else
+ break;
+ j = seekNext(j);
+ }
+ }
+ writeBuffer();
+ input.caret(Math.max(firstNonMaskPos, begin));
+ };
- function shiftR(pos) {
- for (var i = pos, c = settings.placeholder; i < len; i++) {
- if (tests[i]) {
- var j = seekNext(i);
- var t = buffer[i];
- buffer[i] = c;
- if (j < len && tests[j].test(t))
- c = t;
- else
- break;
- }
- }
- };
+ function shiftR(pos) {
+ for (var i = pos, c = settings.placeholder; i < len; i++) {
+ if (tests[i]) {
+ var j = seekNext(i);
+ var t = buffer[i];
+ buffer[i] = c;
+ if (j < len && tests[j].test(t))
+ c = t;
+ else
+ break;
+ }
+ }
+ };
- function keydownEvent(e) {
- var k=e.which;
+ function keydownEvent(e) {
+ var k = e.which;
- //backspace, delete, and escape get special treatment
- if(k == 8 || k == 46 || (iPhone && k == 127)){
- var pos = input.caret(),
+ //backspace, delete, and escape get special treatment
+ if (k == 8 || k == 46 || (iPhone && k == 127)) {
+ var pos = input.caret(),
begin = pos.begin,
end = pos.end;
-
- if(end-begin==0){
- begin=k!=46?seekPrev(begin):(end=seekNext(begin-1));
- end=k==46?seekNext(end):end;
- }
- clearBuffer(begin, end);
- shiftL(begin,end-1);
- return false;
- } else if (k == 27) {//escape
- input.val(focusText);
- input.caret(0, checkVal());
- return false;
- }
- };
+ if (end - begin == 0) {
+ begin = k != 46 ? seekPrev(begin) : (end = seekNext(begin - 1));
+ end = k == 46 ? seekNext(end) : end;
+ }
+ clearBuffer(begin, end);
+ shiftL(begin, end - 1);
- function keypressEvent(e) {
- var k = e.which,
+ return false;
+ } else if (k == 27) {//escape
+ input.val(focusText);
+ input.caret(0, checkVal());
+ return false;
+ }
+ };
+
+ function keypressEvent(e) {
+ var k = e.which,
pos = input.caret();
- if (e.ctrlKey || e.altKey || e.metaKey || k<32) {//Ignore
- return true;
- } else if (k) {
- if(pos.end-pos.begin!=0){
- clearBuffer(pos.begin, pos.end);
- shiftL(pos.begin, pos.end-1);
- }
+ if (e.ctrlKey || e.altKey || e.metaKey || k < 32) {//Ignore
+ return true;
+ } else if (k) {
+ if (pos.end - pos.begin != 0) {
+ clearBuffer(pos.begin, pos.end);
+ shiftL(pos.begin, pos.end - 1);
+ }
- var p = seekNext(pos.begin - 1);
- if (p < len) {
- var c = String.fromCharCode(k);
- if (tests[p].test(c)) {
- shiftR(p);
- buffer[p] = c;
- writeBuffer();
- var next = seekNext(p);
- input.caret(next);
- if (settings.completed && next >= len)
- settings.completed.call(input);
- }
- }
- return false;
- }
- };
+ var p = seekNext(pos.begin - 1);
+ if (p < len) {
+ var c = String.fromCharCode(k);
+ if (tests[p].test(c)) {
+ shiftR(p);
+ buffer[p] = c;
+ writeBuffer();
+ var next = seekNext(p);
+ input.caret(next);
+ if (settings.completed && next >= len)
+ settings.completed.call(input);
+ }
+ }
+ return false;
+ }
+ };
- function clearBuffer(start, end) {
- for (var i = start; i < end && i < len; i++) {
- if (tests[i])
- buffer[i] = settings.placeholder;
- }
- };
+ function clearBuffer(start, end) {
+ for (var i = start; i < end && i < len; i++) {
+ if (tests[i])
+ buffer[i] = settings.placeholder;
+ }
+ };
- function writeBuffer() { return input.val(buffer.join('')).val(); };
+ function writeBuffer() { return input.val(buffer.join('')).val(); };
- function checkVal(allow) {
- //try to place characters where they belong
- var test = input.val();
- var lastMatch = -1;
- for (var i = 0, pos = 0; i < len; i++) {
- if (tests[i]) {
- buffer[i] = settings.placeholder;
- while (pos++ < test.length) {
- var c = test.charAt(pos - 1);
- if (tests[i].test(c)) {
- buffer[i] = c;
- lastMatch = i;
- break;
- }
- }
- if (pos > test.length)
- break;
- } else if (buffer[i] == test.charAt(pos) && i!=partialPosition) {
- pos++;
- lastMatch = i;
- }
- }
- if (!allow && lastMatch + 1 < partialPosition) {
- input.val("");
- clearBuffer(0, len);
- } else if (allow || lastMatch + 1 >= partialPosition) {
- writeBuffer();
- if (!allow) input.val(input.val().substring(0, lastMatch + 1));
- }
- return (partialPosition ? i : firstNonMaskPos);
- };
+ function checkVal(allow) {
+ //try to place characters where they belong
+ var test = input.val();
+ var lastMatch = -1;
+ for (var i = 0, pos = 0; i < len; i++) {
+ if (tests[i]) {
+ buffer[i] = settings.placeholder;
+ while (pos++ < test.length) {
+ var c = test.charAt(pos - 1);
+ if (tests[i].test(c)) {
+ buffer[i] = c;
+ lastMatch = i;
+ break;
+ }
+ }
+ if (pos > test.length)
+ break;
+ } else if (buffer[i] == test.charAt(pos) && i != partialPosition) {
+ pos++;
+ lastMatch = i;
+ }
+ }
+ if (!allow && lastMatch + 1 < partialPosition) {
+ input.val("");
+ clearBuffer(0, len);
+ } else if (allow || lastMatch + 1 >= partialPosition) {
+ writeBuffer();
+ if (!allow) input.val(input.val().substring(0, lastMatch + 1));
+ }
+ return (partialPosition ? i : firstNonMaskPos);
+ };
- input.data($.mask.dataName,function(){
- return $.map(buffer, function(c, i) {
- return tests[i]&&c!=settings.placeholder ? c : null;
- }).join('');
- })
+ input.data($.mask.dataName, function () {
+ return $.map(buffer, function (c, i) {
+ return tests[i] && c != settings.placeholder ? c : null;
+ }).join('');
+ })
- if (!input.attr("readonly"))
- input
- .one("unmask", function() {
- input
+ if (!input.attr("readonly"))
+ input
+ .one("unmask", function () {
+ input
.unbind(".mask")
.removeData($.mask.dataName);
})
- .bind("focus.mask", function() {
- focusText = input.val();
- var pos = checkVal();
- writeBuffer();
- var moveCaret=function(){
- if (pos == mask.length)
- input.caret(0, pos);
- else
- input.caret(pos);
- };
- ($.browser.msie ? moveCaret:function(){setTimeout(moveCaret,0)})();
+ .bind("focus.mask", function () {
+ focusText = input.val();
+ var pos = checkVal();
+ writeBuffer();
+ var moveCaret = function () {
+ if (pos == mask.length)
+ input.caret(0, pos);
+ else
+ input.caret(pos);
+ };
+ ($.browser.msie ? moveCaret : function () { setTimeout(moveCaret, 0) })();
})
- .bind("blur.mask", function() {
- checkVal();
- if (input.val() != focusText)
- input.change();
+ .bind("blur.mask", function () {
+ checkVal();
+ if (input.val() != focusText)
+ input.change();
})
.bind("keydown.mask", keydownEvent)
.bind("keypress.mask", keypressEvent)
- .bind(pasteEventName, function() {
- setTimeout(function() { input.caret(checkVal(true)); }, 0);
+ .bind(pasteEventName, function () {
+ setTimeout(function () { input.caret(checkVal(true)); }, 0);
});
- checkVal(); //Perform initial check for existing values
- });
- }
- });
-})(jQuery);
+ checkVal(); //Perform initial check for existing values
+ });
+ }
+ });
+})(jQuery);
Something went wrong with that request. Please try again.