浏览代码

experimental commit 2 for composition events in android #747 #653 #745

Robin Herbots 11 年之前
父节点
当前提交
ae1750991c
共有 4 个文件被更改,包括 65 次插入33 次删除
  1. 21 10
      dist/inputmask/jquery.inputmask.js
  2. 21 10
      dist/jquery.inputmask.bundle.js
  3. 3 3
      dist/jquery.inputmask.bundle.min.js
  4. 20 10
      js/jquery.inputmask.js

+ 21 - 10
dist/inputmask/jquery.inputmask.js

@@ -638,7 +638,7 @@
             return isRTL ? begin - end > 1 || begin - end == 1 && opts.insertMode : end - begin > 1 || end - begin == 1 && opts.insertMode;
             return isRTL ? begin - end > 1 || begin - end == 1 && opts.insertMode : end - begin > 1 || end - begin == 1 && opts.insertMode;
         }
         }
         function installEventRuler(npt) {
         function installEventRuler(npt) {
-            var events = $._data(npt).events;
+            var events = $._data(npt).events, incomposition = !1;
             $.each(events, function(eventType, eventHandlers) {
             $.each(events, function(eventType, eventHandlers) {
                 $.each(eventHandlers, function(ndx, eventHandler) {
                 $.each(eventHandlers, function(ndx, eventHandler) {
                     if ("inputmask" == eventHandler.namespace && "setvalue" != eventHandler.type) {
                     if ("inputmask" == eventHandler.namespace && "setvalue" != eventHandler.type) {
@@ -647,7 +647,7 @@
                             if (!this.readOnly && !this.disabled) {
                             if (!this.readOnly && !this.disabled) {
                                 switch (e.type) {
                                 switch (e.type) {
                                   case "input":
                                   case "input":
-                                    if (skipInputEvent === !0) return skipInputEvent = !1, e.preventDefault;
+                                    if (skipInputEvent === !0 || incomposition) return skipInputEvent = !1, e.preventDefault;
                                     break;
                                     break;
 
 
                                   case "keydown":
                                   case "keydown":
@@ -659,9 +659,17 @@
                                     skipKeyPressEvent = !0;
                                     skipKeyPressEvent = !0;
                                     break;
                                     break;
 
 
+                                  case "compositionstart":
                                   case "compositionupdate":
                                   case "compositionupdate":
                                   case "compositionend":
                                   case "compositionend":
-                                    skipInputEvent = !0;
+                                    incomposition = !0;
+                                    break;
+
+                                  case "compositionupdate":
+                                    break;
+
+                                  case "compositionend":
+                                    incomposition = !1;
                                 }
                                 }
                                 return handler.apply(this, arguments);
                                 return handler.apply(this, arguments);
                             }
                             }
@@ -855,15 +863,18 @@
         }
         }
         function compositionEndEvent(e) {
         function compositionEndEvent(e) {
             var input = this, caretPos = caret(input);
             var input = this, caretPos = caret(input);
-            return setTimeout(function() {
+            getMaskSet().validPositions = $.extend(!0, {}, compositionValidPos), setTimeout(function() {
                 var newData = e.originalEvent.data;
                 var newData = e.originalEvent.data;
-                caret(input, caretPos.begin - 1, caretPos.end);
+                newData = newData.replace(compositionData, ""), caret(input, caretPos.begin - 1, caretPos.end);
                 for (var i = 0; i < newData.length; i++) {
                 for (var i = 0; i < newData.length; i++) {
                     var keypress = $.Event("keypress");
                     var keypress = $.Event("keypress");
                     keypress.which = newData.charCodeAt(i), skipKeyPressEvent = !1, ignorable = !1, 
                     keypress.which = newData.charCodeAt(i), skipKeyPressEvent = !1, ignorable = !1, 
                     keypressEvent.call(input, keypress);
                     keypressEvent.call(input, keypress);
                 }
                 }
-            }, 0), !1;
+                compositionData = e.originalEvent.data;
+                var forwardPosition = getMaskSet().p;
+                writeBuffer(input, getBuffer(), opts.numericInput ? seekPrevious(forwardPosition) : forwardPosition);
+            }, 0);
         }
         }
         function mask(el) {
         function mask(el) {
             if ($el = $(el), $el.is(":input") && isInputTypeSupported($el.attr("type"))) {
             if ($el = $(el), $el.is(":input") && isInputTypeSupported($el.attr("type"))) {
@@ -943,9 +954,9 @@
                     opts.showTooltip && $input.prop("title", getMaskSet().mask);
                     opts.showTooltip && $input.prop("title", getMaskSet().mask);
                 }).bind("complete.inputmask", opts.oncomplete).bind("incomplete.inputmask", opts.onincomplete).bind("cleared.inputmask", opts.oncleared), 
                 }).bind("complete.inputmask", opts.oncomplete).bind("incomplete.inputmask", opts.onincomplete).bind("cleared.inputmask", opts.oncleared), 
                 $el.bind("keydown.inputmask", keydownEvent).bind("keypress.inputmask", keypressEvent).bind("keyup.inputmask", keyupEvent).bind("compositionstart.inputmask", function() {
                 $el.bind("keydown.inputmask", keydownEvent).bind("keypress.inputmask", keypressEvent).bind("keyup.inputmask", keyupEvent).bind("compositionstart.inputmask", function() {
-                    undoValue = getBuffer().join("");
-                }).bind("compositionupdate.inputmask", function() {}).bind("compositionend.inputmask", compositionEndEvent), 
-                "paste" === PasteEventType && $el.bind("input.inputmask", inputFallBackEvent), patchValueProperty(el);
+                    undoValue = getBuffer().join(""), compositionValidPos = $.extend(!0, {}, getMaskSet().validPositions);
+                }).bind("compositionend.inputmask", compositionEndEvent), "paste" === PasteEventType && $el.bind("input.inputmask", inputFallBackEvent), 
+                patchValueProperty(el);
                 var initialValue = $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(el, el._valueGet(), opts) || el._valueGet() : el._valueGet();
                 var initialValue = $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(el, el._valueGet(), opts) || el._valueGet() : el._valueGet();
                 checkVal(el, !0, !1, initialValue.split(""));
                 checkVal(el, !0, !1, initialValue.split(""));
                 var buffer = getBuffer().slice();
                 var buffer = getBuffer().slice();
@@ -959,7 +970,7 @@
                 installEventRuler(el);
                 installEventRuler(el);
             }
             }
         }
         }
-        var undoValue, $el, maxLength, isRTL = !1, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, firstClick = !0;
+        var undoValue, compositionData, compositionValidPos, $el, maxLength, isRTL = !1, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, firstClick = !0;
         if (void 0 != actionObj) switch (actionObj.action) {
         if (void 0 != actionObj) switch (actionObj.action) {
           case "isComplete":
           case "isComplete":
             return $el = $(actionObj.el), maskset = $el.data("_inputmask").maskset, opts = $el.data("_inputmask").opts, 
             return $el = $(actionObj.el), maskset = $el.data("_inputmask").maskset, opts = $el.data("_inputmask").opts, 

+ 21 - 10
dist/jquery.inputmask.bundle.js

@@ -636,7 +636,7 @@
             return isRTL ? begin - end > 1 || begin - end == 1 && opts.insertMode : end - begin > 1 || end - begin == 1 && opts.insertMode;
             return isRTL ? begin - end > 1 || begin - end == 1 && opts.insertMode : end - begin > 1 || end - begin == 1 && opts.insertMode;
         }
         }
         function installEventRuler(npt) {
         function installEventRuler(npt) {
-            var events = $._data(npt).events;
+            var events = $._data(npt).events, incomposition = !1;
             $.each(events, function(eventType, eventHandlers) {
             $.each(events, function(eventType, eventHandlers) {
                 $.each(eventHandlers, function(ndx, eventHandler) {
                 $.each(eventHandlers, function(ndx, eventHandler) {
                     if ("inputmask" == eventHandler.namespace && "setvalue" != eventHandler.type) {
                     if ("inputmask" == eventHandler.namespace && "setvalue" != eventHandler.type) {
@@ -645,7 +645,7 @@
                             if (!this.readOnly && !this.disabled) {
                             if (!this.readOnly && !this.disabled) {
                                 switch (e.type) {
                                 switch (e.type) {
                                   case "input":
                                   case "input":
-                                    if (skipInputEvent === !0) return skipInputEvent = !1, e.preventDefault;
+                                    if (skipInputEvent === !0 || incomposition) return skipInputEvent = !1, e.preventDefault;
                                     break;
                                     break;
 
 
                                   case "keydown":
                                   case "keydown":
@@ -657,9 +657,17 @@
                                     skipKeyPressEvent = !0;
                                     skipKeyPressEvent = !0;
                                     break;
                                     break;
 
 
+                                  case "compositionstart":
                                   case "compositionupdate":
                                   case "compositionupdate":
                                   case "compositionend":
                                   case "compositionend":
-                                    skipInputEvent = !0;
+                                    incomposition = !0;
+                                    break;
+
+                                  case "compositionupdate":
+                                    break;
+
+                                  case "compositionend":
+                                    incomposition = !1;
                                 }
                                 }
                                 return handler.apply(this, arguments);
                                 return handler.apply(this, arguments);
                             }
                             }
@@ -853,15 +861,18 @@
         }
         }
         function compositionEndEvent(e) {
         function compositionEndEvent(e) {
             var input = this, caretPos = caret(input);
             var input = this, caretPos = caret(input);
-            return setTimeout(function() {
+            getMaskSet().validPositions = $.extend(!0, {}, compositionValidPos), setTimeout(function() {
                 var newData = e.originalEvent.data;
                 var newData = e.originalEvent.data;
-                caret(input, caretPos.begin - 1, caretPos.end);
+                newData = newData.replace(compositionData, ""), caret(input, caretPos.begin - 1, caretPos.end);
                 for (var i = 0; i < newData.length; i++) {
                 for (var i = 0; i < newData.length; i++) {
                     var keypress = $.Event("keypress");
                     var keypress = $.Event("keypress");
                     keypress.which = newData.charCodeAt(i), skipKeyPressEvent = !1, ignorable = !1, 
                     keypress.which = newData.charCodeAt(i), skipKeyPressEvent = !1, ignorable = !1, 
                     keypressEvent.call(input, keypress);
                     keypressEvent.call(input, keypress);
                 }
                 }
-            }, 0), !1;
+                compositionData = e.originalEvent.data;
+                var forwardPosition = getMaskSet().p;
+                writeBuffer(input, getBuffer(), opts.numericInput ? seekPrevious(forwardPosition) : forwardPosition);
+            }, 0);
         }
         }
         function mask(el) {
         function mask(el) {
             if ($el = $(el), $el.is(":input") && isInputTypeSupported($el.attr("type"))) {
             if ($el = $(el), $el.is(":input") && isInputTypeSupported($el.attr("type"))) {
@@ -941,9 +952,9 @@
                     opts.showTooltip && $input.prop("title", getMaskSet().mask);
                     opts.showTooltip && $input.prop("title", getMaskSet().mask);
                 }).bind("complete.inputmask", opts.oncomplete).bind("incomplete.inputmask", opts.onincomplete).bind("cleared.inputmask", opts.oncleared), 
                 }).bind("complete.inputmask", opts.oncomplete).bind("incomplete.inputmask", opts.onincomplete).bind("cleared.inputmask", opts.oncleared), 
                 $el.bind("keydown.inputmask", keydownEvent).bind("keypress.inputmask", keypressEvent).bind("keyup.inputmask", keyupEvent).bind("compositionstart.inputmask", function() {
                 $el.bind("keydown.inputmask", keydownEvent).bind("keypress.inputmask", keypressEvent).bind("keyup.inputmask", keyupEvent).bind("compositionstart.inputmask", function() {
-                    undoValue = getBuffer().join("");
-                }).bind("compositionupdate.inputmask", function() {}).bind("compositionend.inputmask", compositionEndEvent), 
-                "paste" === PasteEventType && $el.bind("input.inputmask", inputFallBackEvent), patchValueProperty(el);
+                    undoValue = getBuffer().join(""), compositionValidPos = $.extend(!0, {}, getMaskSet().validPositions);
+                }).bind("compositionend.inputmask", compositionEndEvent), "paste" === PasteEventType && $el.bind("input.inputmask", inputFallBackEvent), 
+                patchValueProperty(el);
                 var initialValue = $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(el, el._valueGet(), opts) || el._valueGet() : el._valueGet();
                 var initialValue = $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(el, el._valueGet(), opts) || el._valueGet() : el._valueGet();
                 checkVal(el, !0, !1, initialValue.split(""));
                 checkVal(el, !0, !1, initialValue.split(""));
                 var buffer = getBuffer().slice();
                 var buffer = getBuffer().slice();
@@ -957,7 +968,7 @@
                 installEventRuler(el);
                 installEventRuler(el);
             }
             }
         }
         }
-        var undoValue, $el, maxLength, isRTL = !1, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, firstClick = !0;
+        var undoValue, compositionData, compositionValidPos, $el, maxLength, isRTL = !1, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, firstClick = !0;
         if (void 0 != actionObj) switch (actionObj.action) {
         if (void 0 != actionObj) switch (actionObj.action) {
           case "isComplete":
           case "isComplete":
             return $el = $(actionObj.el), maskset = $el.data("_inputmask").maskset, opts = $el.data("_inputmask").opts, 
             return $el = $(actionObj.el), maskset = $el.data("_inputmask").maskset, opts = $el.data("_inputmask").opts, 

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


+ 20 - 10
js/jquery.inputmask.js

@@ -335,6 +335,8 @@
         function maskScope(actionObj, maskset, opts) {
         function maskScope(actionObj, maskset, opts) {
             var isRTL = false,
             var isRTL = false,
                 undoValue,
                 undoValue,
+                compositionData,
+                compositionValidPos,
                 $el,
                 $el,
                 skipKeyPressEvent = false, //Safari 5.1.x - modal dialog fires keypress twice workaround
                 skipKeyPressEvent = false, //Safari 5.1.x - modal dialog fires keypress twice workaround
                 skipInputEvent = false, //skip when triggered from within inputmask
                 skipInputEvent = false, //skip when triggered from within inputmask
@@ -1119,7 +1121,8 @@
                 (end - begin) > 1 || ((end - begin) == 1 && opts.insertMode);
                 (end - begin) > 1 || ((end - begin) == 1 && opts.insertMode);
             }
             }
             function installEventRuler(npt) {
             function installEventRuler(npt) {
-                var events = $._data(npt).events;
+                var events = $._data(npt).events,
+                    incomposition = false;
 
 
                 $.each(events, function (eventType, eventHandlers) {
                 $.each(events, function (eventType, eventHandlers) {
                     $.each(eventHandlers, function (ndx, eventHandler) {
                     $.each(eventHandlers, function (ndx, eventHandler) {
@@ -1127,13 +1130,13 @@
                             if (eventHandler.type != "setvalue") {
                             if (eventHandler.type != "setvalue") {
                                 var handler = eventHandler.handler;
                                 var handler = eventHandler.handler;
                                 eventHandler.handler = function (e) {
                                 eventHandler.handler = function (e) {
-                                    //console.log(e.type);
+                                    //console.log("triggered " + e.type);
                                     if (this.readOnly || this.disabled)
                                     if (this.readOnly || this.disabled)
                                         e.preventDefault;
                                         e.preventDefault;
                                     else {
                                     else {
                                         switch (e.type) {
                                         switch (e.type) {
                                             case "input":
                                             case "input":
-                                                if (skipInputEvent === true) {
+                                                if (skipInputEvent === true || incomposition) {
                                                     skipInputEvent = false;
                                                     skipInputEvent = false;
                                                     return e.preventDefault;
                                                     return e.preventDefault;
                                                 }
                                                 }
@@ -1147,10 +1150,16 @@
                                                     return e.preventDefault;
                                                     return e.preventDefault;
                                                 skipKeyPressEvent = true;
                                                 skipKeyPressEvent = true;
                                                 break;
                                                 break;
-                                            case "compositionupdate": case "compositionend":
-                                                skipInputEvent = true; //stop inputFallback
+                                            case "compositionstart": case "compositionupdate": case "compositionend":
+                                                incomposition = true;
+                                                break;
+                                            case "compositionupdate":
+                                                break;
+                                            case "compositionend":
+                                                incomposition = false;
                                                 break;
                                                 break;
                                         }
                                         }
+                                        //console.log("executed " + e.type);
                                         return handler.apply(this, arguments);
                                         return handler.apply(this, arguments);
                                     }
                                     }
                                 };
                                 };
@@ -1533,8 +1542,6 @@
             function inputFallBackEvent(e) { //fallback when keypress & compositionevents fail
             function inputFallBackEvent(e) { //fallback when keypress & compositionevents fail
                 var input = this;
                 var input = this;
                 checkVal(input, true, false);
                 checkVal(input, true, false);
-                //var forwardPosition = getMaskSet()["p"];
-                //writeBuffer(input, getBuffer(), opts.numericInput ? seekPrevious(forwardPosition) : forwardPosition);
 
 
                 if (isComplete(getBuffer()) === true)
                 if (isComplete(getBuffer()) === true)
                     $(input).trigger("complete");
                     $(input).trigger("complete");
@@ -1543,8 +1550,10 @@
             }
             }
             function compositionEndEvent(e) {
             function compositionEndEvent(e) {
                 var input = this, caretPos = caret(input);
                 var input = this, caretPos = caret(input);
+                getMaskSet()["validPositions"] = $.extend(true, {}, compositionValidPos);
                 setTimeout(function () {
                 setTimeout(function () {
                     var newData = e.originalEvent.data;
                     var newData = e.originalEvent.data;
+                    newData = newData.replace(compositionData, "");
                     caret(input, caretPos.begin - 1, caretPos.end);
                     caret(input, caretPos.begin - 1, caretPos.end);
                     for (var i = 0; i < newData.length; i++) {
                     for (var i = 0; i < newData.length; i++) {
                         var keypress = $.Event("keypress");
                         var keypress = $.Event("keypress");
@@ -1553,8 +1562,10 @@
                         ignorable = false;
                         ignorable = false;
                         keypressEvent.call(input, keypress);
                         keypressEvent.call(input, keypress);
                     }
                     }
+                    compositionData = e.originalEvent.data;
+                    var forwardPosition = getMaskSet()["p"];
+                    writeBuffer(input, getBuffer(), opts.numericInput ? seekPrevious(forwardPosition) : forwardPosition);
                 }, 0);
                 }, 0);
-                return false;
             }
             }
             function mask(el) {
             function mask(el) {
                 $el = $(el);
                 $el = $(el);
@@ -1722,8 +1733,7 @@
                     ).bind("keyup.inputmask", keyupEvent
                     ).bind("keyup.inputmask", keyupEvent
                     ).bind("compositionstart.inputmask", function (e) {
                     ).bind("compositionstart.inputmask", function (e) {
                         undoValue = getBuffer().join('');
                         undoValue = getBuffer().join('');
-                    }).bind("compositionupdate.inputmask", function (e) {
-
+                        compositionValidPos = $.extend(true, {}, getMaskSet()["validPositions"]);
                     }).bind("compositionend.inputmask", compositionEndEvent);
                     }).bind("compositionend.inputmask", compositionEndEvent);
 
 
                     if (PasteEventType === "paste") {
                     if (PasteEventType === "paste") {