@@ -34,6 +34,8 @@ var WEEK_REGEXP = /^(\d{4,})-W(\d\d)$/;
3434var MONTH_REGEXP = / ^ ( \d { 4 , } ) - ( \d \d ) $ / ;
3535var TIME_REGEXP = / ^ ( \d \d ) : ( \d \d ) (?: : ( \d \d ) ( \. \d { 1 , 3 } ) ? ) ? $ / ;
3636
37+ var IE_INPUTS_WITH_CLEARING = [ 'text' , 'number' , 'date' , 'datetime-local' , 'email' , 'month' , 'time' , 'url' , 'week' ] ;
38+
3739var PARTIAL_VALIDATION_EVENTS = 'keydown wheel mousedown' ;
3840var PARTIAL_VALIDATION_TYPES = createMap ( ) ;
3941forEach ( 'date,datetime-local,month,time,week' . split ( ',' ) , function ( type ) {
@@ -1126,7 +1128,11 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
11261128 } ) ;
11271129 }
11281130
1129- var timeout ;
1131+ var timeout , oldVal ;
1132+ var viewValueUpdated = false , msieInput = msie >= 10 && msie <= 11 ;
1133+ if ( msieInput && attr . type in IE_INPUTS_WITH_CLEARING ) {
1134+ oldVal = element . val ( ) ;
1135+ }
11301136
11311137 var listener = function ( ev ) {
11321138 if ( timeout ) {
@@ -1152,10 +1158,18 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
11521158 }
11531159 } ;
11541160
1161+ function ieListener ( ev ) {
1162+ var val = element . val ( ) ;
1163+ if ( val === oldVal && ! viewValueUpdated ) return ;
1164+ oldVal = val ;
1165+ viewValueUpdated = false ;
1166+ listener ( ev ) ;
1167+ }
1168+
11551169 // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the
11561170 // input event on backspace, delete or cut
11571171 if ( $sniffer . hasEvent ( 'input' ) ) {
1158- element . on ( 'input' , listener ) ;
1172+ element . on ( 'input' , msie ? ieListener : listener ) ;
11591173 } else {
11601174 var deferListener = function ( ev , input , origValue ) {
11611175 if ( ! timeout ) {
@@ -1212,6 +1226,10 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
12121226 // Workaround for Firefox validation #12102.
12131227 var value = ctrl . $isEmpty ( ctrl . $viewValue ) ? '' : ctrl . $viewValue ;
12141228 if ( element . val ( ) !== value ) {
1229+ // Workaround for IE 10 & 11 input updates #11193
1230+ if ( msieInput ) {
1231+ viewValueUpdated = true ;
1232+ }
12151233 element . val ( value ) ;
12161234 }
12171235 } ;
0 commit comments