@@ -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  =  false ; 
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