@@ -1103,11 +1103,11 @@ function stringBasedInputType(ctrl) {
11031103}
11041104
11051105function textInputType ( scope , element , attr , ctrl , $sniffer , $browser ) {
1106- baseInputType ( scope , element , attr , ctrl , $sniffer , $browser ) ;
1106+ baseInputType ( scope , element , attr , ctrl , $sniffer , $browser , 'text' ) ;
11071107 stringBasedInputType ( ctrl ) ;
11081108}
11091109
1110- function baseInputType ( scope , element , attr , ctrl , $sniffer , $browser ) {
1110+ function baseInputType ( scope , element , attr , ctrl , $sniffer , $browser , inputType ) {
11111111 var type = lowercase ( element [ 0 ] . type ) ;
11121112
11131113 // In composition mode, users are still inputing intermediate text buffer,
@@ -1126,7 +1126,11 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
11261126 } ) ;
11271127 }
11281128
1129- var timeout ;
1129+ var timeout , oldVal ;
1130+ var viewValueUpdated = true , msieInput = msie >= 10 && msie <= 11 ;
1131+ if ( msieInput && inputType === 'text' ) {
1132+ oldVal = element . val ( ) ;
1133+ }
11301134
11311135 var listener = function ( ev ) {
11321136 if ( timeout ) {
@@ -1152,10 +1156,18 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
11521156 }
11531157 } ;
11541158
1159+ function ieListener ( ev ) {
1160+ var val = element . val ( ) ;
1161+ if ( val === oldVal && ! viewValueUpdated ) return ;
1162+ oldVal = val ;
1163+ viewValueUpdated = isDefined ( ctrl . $modelValue ) ;
1164+ listener ( ev ) ;
1165+ }
1166+
11551167 // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the
11561168 // input event on backspace, delete or cut
11571169 if ( $sniffer . hasEvent ( 'input' ) ) {
1158- element . on ( 'input' , listener ) ;
1170+ element . on ( 'input' , msie ? ieListener : listener ) ;
11591171 } else {
11601172 var deferListener = function ( ev , input , origValue ) {
11611173 if ( ! timeout ) {
@@ -1212,6 +1224,10 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
12121224 // Workaround for Firefox validation #12102.
12131225 var value = ctrl . $isEmpty ( ctrl . $viewValue ) ? '' : ctrl . $viewValue ;
12141226 if ( element . val ( ) !== value ) {
1227+ // Workaround for IE 10 & 11 input updates #11193
1228+ if ( msieInput ) {
1229+ viewValueUpdated = true ;
1230+ }
12151231 element . val ( value ) ;
12161232 }
12171233 } ;
0 commit comments