ソースを参照

experimental commit 3 for composition events in android #653 #745 #692 #465

Robin Herbots 11 年 前
コミット
8561175a95

+ 20 - 17
dist/inputmask/jquery.inputmask.js

@@ -644,10 +644,10 @@
                     if ("inputmask" == eventHandler.namespace && "setvalue" != eventHandler.type) {
                         var handler = eventHandler.handler;
                         eventHandler.handler = function(e) {
-                            if (!this.readOnly && !this.disabled) {
+                            if (console.log("triggered " + e.type), !this.readOnly && !this.disabled) {
                                 switch (e.type) {
                                   case "input":
-                                    if (skipInputEvent === !0 || incomposition) return skipInputEvent = !1, e.preventDefault;
+                                    if (skipInputEvent === !0 || incomposition) return skipInputEvent = !1, e.preventDefault();
                                     break;
 
                                   case "keydown":
@@ -655,13 +655,11 @@
                                     break;
 
                                   case "keypress":
-                                    if (skipKeyPressEvent === !0) return e.preventDefault;
+                                    if (skipKeyPressEvent === !0) return e.preventDefault();
                                     skipKeyPressEvent = !0;
                                     break;
 
                                   case "compositionstart":
-                                  case "compositionupdate":
-                                  case "compositionend":
                                     incomposition = !0;
                                     break;
 
@@ -669,11 +667,11 @@
                                     break;
 
                                   case "compositionend":
-                                    incomposition = !1;
+                                    incomposition = !1, skipInputEvent = !0;
                                 }
-                                return handler.apply(this, arguments);
+                                return console.log("executed " + e.type), handler.apply(this, arguments);
                             }
-                            e.preventDefault;
+                            e.preventDefault();
                         };
                     }
                 });
@@ -861,21 +859,28 @@
             checkVal(input, !0, !1), isComplete(getBuffer()) === !0 && $(input).trigger("complete"), 
             e.preventDefault();
         }
-        function compositionEndEvent(e) {
-            var input = this, caretPos = caret(input);
+        function compositionStartEvent(e) {
+            var input = this;
+            undoValue = getBuffer().join(""), 0 != e.originalEvent.data.indexOf(compositionData) && (compositionValidPos = $.extend(!0, {}, getMaskSet().validPositions), 
+            compositionCaretPos = caret(input));
+        }
+        function compositionUpdateEvent(e) {
+            var input = this, caretPos = compositionCaretPos;
             getMaskSet().validPositions = $.extend(!0, {}, compositionValidPos), setTimeout(function() {
                 var newData = e.originalEvent.data;
-                newData = newData.replace(compositionData, ""), caret(input, caretPos.begin - 1, caretPos.end);
+                caret(input, caretPos.begin, caretPos.end);
                 for (var i = 0; i < newData.length; i++) {
                     var keypress = $.Event("keypress");
                     keypress.which = newData.charCodeAt(i), skipKeyPressEvent = !1, ignorable = !1, 
                     keypressEvent.call(input, keypress);
                 }
-                compositionData = e.originalEvent.data;
                 var forwardPosition = getMaskSet().p;
                 writeBuffer(input, getBuffer(), opts.numericInput ? seekPrevious(forwardPosition) : forwardPosition);
             }, 0);
         }
+        function compositionEndEvent(e) {
+            compositionData = e.originalEvent.data;
+        }
         function mask(el) {
             if ($el = $(el), $el.is(":input") && isInputTypeSupported($el.attr("type"))) {
                 if ($el.data("_inputmask", {
@@ -953,10 +958,8 @@
                     }), input._valueGet() == getBufferTemplate().join("") && $input.trigger("cleared"), 
                     opts.showTooltip && $input.prop("title", getMaskSet().mask);
                 }).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() {
-                    undoValue = getBuffer().join(""), compositionValidPos = $.extend(!0, {}, getMaskSet().validPositions);
-                }).bind("compositionend.inputmask", compositionEndEvent), "paste" === PasteEventType && $el.bind("input.inputmask", inputFallBackEvent), 
-                patchValueProperty(el);
+                $el.bind("keydown.inputmask", keydownEvent).bind("keypress.inputmask", keypressEvent).bind("keyup.inputmask", keyupEvent).bind("compositionstart.inputmask", compositionStartEvent).bind("compositionupdate.inputmask", compositionUpdateEvent).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();
                 checkVal(el, !0, !1, initialValue.split(""));
                 var buffer = getBuffer().slice();
@@ -970,7 +973,7 @@
                 installEventRuler(el);
             }
         }
-        var undoValue, compositionData, compositionValidPos, $el, maxLength, isRTL = !1, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, firstClick = !0;
+        var undoValue, compositionValidPos, compositionCaretPos, compositionData, $el, maxLength, isRTL = !1, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, firstClick = !0;
         if (void 0 != actionObj) switch (actionObj.action) {
           case "isComplete":
             return $el = $(actionObj.el), maskset = $el.data("_inputmask").maskset, opts = $el.data("_inputmask").opts, 

+ 20 - 17
dist/jquery.inputmask.bundle.js

@@ -642,10 +642,10 @@
                     if ("inputmask" == eventHandler.namespace && "setvalue" != eventHandler.type) {
                         var handler = eventHandler.handler;
                         eventHandler.handler = function(e) {
-                            if (!this.readOnly && !this.disabled) {
+                            if (console.log("triggered " + e.type), !this.readOnly && !this.disabled) {
                                 switch (e.type) {
                                   case "input":
-                                    if (skipInputEvent === !0 || incomposition) return skipInputEvent = !1, e.preventDefault;
+                                    if (skipInputEvent === !0 || incomposition) return skipInputEvent = !1, e.preventDefault();
                                     break;
 
                                   case "keydown":
@@ -653,13 +653,11 @@
                                     break;
 
                                   case "keypress":
-                                    if (skipKeyPressEvent === !0) return e.preventDefault;
+                                    if (skipKeyPressEvent === !0) return e.preventDefault();
                                     skipKeyPressEvent = !0;
                                     break;
 
                                   case "compositionstart":
-                                  case "compositionupdate":
-                                  case "compositionend":
                                     incomposition = !0;
                                     break;
 
@@ -667,11 +665,11 @@
                                     break;
 
                                   case "compositionend":
-                                    incomposition = !1;
+                                    incomposition = !1, skipInputEvent = !0;
                                 }
-                                return handler.apply(this, arguments);
+                                return console.log("executed " + e.type), handler.apply(this, arguments);
                             }
-                            e.preventDefault;
+                            e.preventDefault();
                         };
                     }
                 });
@@ -859,21 +857,28 @@
             checkVal(input, !0, !1), isComplete(getBuffer()) === !0 && $(input).trigger("complete"), 
             e.preventDefault();
         }
-        function compositionEndEvent(e) {
-            var input = this, caretPos = caret(input);
+        function compositionStartEvent(e) {
+            var input = this;
+            undoValue = getBuffer().join(""), 0 != e.originalEvent.data.indexOf(compositionData) && (compositionValidPos = $.extend(!0, {}, getMaskSet().validPositions), 
+            compositionCaretPos = caret(input));
+        }
+        function compositionUpdateEvent(e) {
+            var input = this, caretPos = compositionCaretPos;
             getMaskSet().validPositions = $.extend(!0, {}, compositionValidPos), setTimeout(function() {
                 var newData = e.originalEvent.data;
-                newData = newData.replace(compositionData, ""), caret(input, caretPos.begin - 1, caretPos.end);
+                caret(input, caretPos.begin, caretPos.end);
                 for (var i = 0; i < newData.length; i++) {
                     var keypress = $.Event("keypress");
                     keypress.which = newData.charCodeAt(i), skipKeyPressEvent = !1, ignorable = !1, 
                     keypressEvent.call(input, keypress);
                 }
-                compositionData = e.originalEvent.data;
                 var forwardPosition = getMaskSet().p;
                 writeBuffer(input, getBuffer(), opts.numericInput ? seekPrevious(forwardPosition) : forwardPosition);
             }, 0);
         }
+        function compositionEndEvent(e) {
+            compositionData = e.originalEvent.data;
+        }
         function mask(el) {
             if ($el = $(el), $el.is(":input") && isInputTypeSupported($el.attr("type"))) {
                 if ($el.data("_inputmask", {
@@ -951,10 +956,8 @@
                     }), input._valueGet() == getBufferTemplate().join("") && $input.trigger("cleared"), 
                     opts.showTooltip && $input.prop("title", getMaskSet().mask);
                 }).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() {
-                    undoValue = getBuffer().join(""), compositionValidPos = $.extend(!0, {}, getMaskSet().validPositions);
-                }).bind("compositionend.inputmask", compositionEndEvent), "paste" === PasteEventType && $el.bind("input.inputmask", inputFallBackEvent), 
-                patchValueProperty(el);
+                $el.bind("keydown.inputmask", keydownEvent).bind("keypress.inputmask", keypressEvent).bind("keyup.inputmask", keyupEvent).bind("compositionstart.inputmask", compositionStartEvent).bind("compositionupdate.inputmask", compositionUpdateEvent).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();
                 checkVal(el, !0, !1, initialValue.split(""));
                 var buffer = getBuffer().slice();
@@ -968,7 +971,7 @@
                 installEventRuler(el);
             }
         }
-        var undoValue, compositionData, compositionValidPos, $el, maxLength, isRTL = !1, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, firstClick = !0;
+        var undoValue, compositionValidPos, compositionCaretPos, compositionData, $el, maxLength, isRTL = !1, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, firstClick = !0;
         if (void 0 != actionObj) switch (actionObj.action) {
           case "isComplete":
             return $el = $(actionObj.el), maskset = $el.data("_inputmask").maskset, opts = $el.data("_inputmask").opts, 

ファイルの差分が大きいため隠しています
+ 3 - 3
dist/jquery.inputmask.bundle.min.js


+ 27 - 17
js/jquery.inputmask.js

@@ -335,8 +335,9 @@
         function maskScope(actionObj, maskset, opts) {
             var isRTL = false,
                 undoValue,
-                compositionData,
                 compositionValidPos,
+                compositionCaretPos,
+                compositionData,
                 $el,
                 skipKeyPressEvent = false, //Safari 5.1.x - modal dialog fires keypress twice workaround
                 skipInputEvent = false, //skip when triggered from within inputmask
@@ -1130,15 +1131,15 @@
                             if (eventHandler.type != "setvalue") {
                                 var handler = eventHandler.handler;
                                 eventHandler.handler = function (e) {
-                                    //console.log("triggered " + e.type);
+                                    console.log("triggered " + e.type);
                                     if (this.readOnly || this.disabled)
-                                        e.preventDefault;
+                                        e.preventDefault();
                                     else {
                                         switch (e.type) {
                                             case "input":
                                                 if (skipInputEvent === true || incomposition) {
                                                     skipInputEvent = false;
-                                                    return e.preventDefault;
+                                                    return e.preventDefault();
                                                 }
                                                 break;
                                             case "keydown":
@@ -1147,19 +1148,20 @@
                                                 break;
                                             case "keypress":
                                                 if (skipKeyPressEvent === true)
-                                                    return e.preventDefault;
+                                                    return e.preventDefault();
                                                 skipKeyPressEvent = true;
                                                 break;
-                                            case "compositionstart": case "compositionupdate": case "compositionend":
+                                            case "compositionstart":
                                                 incomposition = true;
                                                 break;
                                             case "compositionupdate":
                                                 break;
                                             case "compositionend":
                                                 incomposition = false;
+                                                skipInputEvent = true;
                                                 break;
                                         }
-                                        //console.log("executed " + e.type);
+                                        console.log("executed " + e.type);
                                         return handler.apply(this, arguments);
                                     }
                                 };
@@ -1548,13 +1550,20 @@
 
                 e.preventDefault();
             }
-            function compositionEndEvent(e) {
-                var input = this, caretPos = caret(input);
+            function compositionStartEvent(e) {
+                var input = this;
+                undoValue = getBuffer().join('');
+                if (e.originalEvent.data.indexOf(compositionData) != 0) {
+                    compositionValidPos = $.extend(true, {}, getMaskSet()["validPositions"]);
+                    compositionCaretPos = caret(input);
+                }
+            }
+            function compositionUpdateEvent(e) {
+                var input = this, caretPos = compositionCaretPos;
                 getMaskSet()["validPositions"] = $.extend(true, {}, compositionValidPos);
                 setTimeout(function () {
                     var newData = e.originalEvent.data;
-                    newData = newData.replace(compositionData, "");
-                    caret(input, caretPos.begin - 1, caretPos.end);
+                    caret(input, caretPos.begin, caretPos.end);
                     for (var i = 0; i < newData.length; i++) {
                         var keypress = $.Event("keypress");
                         keypress.which = newData.charCodeAt(i);
@@ -1562,11 +1571,13 @@
                         ignorable = false;
                         keypressEvent.call(input, keypress);
                     }
-                    compositionData = e.originalEvent.data;
                     var forwardPosition = getMaskSet()["p"];
                     writeBuffer(input, getBuffer(), opts.numericInput ? seekPrevious(forwardPosition) : forwardPosition);
                 }, 0);
             }
+            function compositionEndEvent(e) {
+                compositionData = e.originalEvent.data;
+            }
             function mask(el) {
                 $el = $(el);
                 if ($el.is(":input") && isInputTypeSupported($el.attr("type"))) {
@@ -1712,7 +1723,7 @@
                         if ((opts.clearMaskOnLostFocus || opts.clearIncomplete) && input._valueGet() == getBufferTemplate().join(''))
                             input._valueSet('');
                     }).bind('cut.inputmask', function (e) {
-                        skipInputEvent = true; //stop inutFallback
+                        skipInputEvent = true; //stop inputFallback
                         var input = this, $input = $(input), pos = caret(input);
 
                         handleRemove(input, $.inputmask.keyCode.DELETE, pos);
@@ -1731,10 +1742,9 @@
                     $el.bind("keydown.inputmask", keydownEvent
                     ).bind("keypress.inputmask", keypressEvent
                     ).bind("keyup.inputmask", keyupEvent
-                    ).bind("compositionstart.inputmask", function (e) {
-                        undoValue = getBuffer().join('');
-                        compositionValidPos = $.extend(true, {}, getMaskSet()["validPositions"]);
-                    }).bind("compositionend.inputmask", compositionEndEvent);
+                    ).bind("compositionstart.inputmask", compositionStartEvent
+                    ).bind("compositionupdate.inputmask", compositionUpdateEvent
+                    ).bind("compositionend.inputmask", compositionEndEvent);
 
                     if (PasteEventType === "paste") {
                         $el.bind("input.inputmask", inputFallBackEvent);