mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-17 07:40:22 +00:00
fix(ngModel): use keydown/change events on IE9 instead of input
On IE9 the input event is not fired when backspace or delete key are pressed or when cut is performed. This makes listening on the input event unreliable and therefore it's better for us to just use keydown/change events instead. Closes #879
This commit is contained in:
parent
5bcb749abb
commit
49dfdf8f02
4 changed files with 22 additions and 8 deletions
|
|
@ -379,7 +379,8 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|||
}
|
||||
};
|
||||
|
||||
// if the browser does support "input" event, we are fine
|
||||
// if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the
|
||||
// input event on backspace, delete or cut
|
||||
if ($sniffer.hasEvent('input')) {
|
||||
element.bind('input', listener);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -22,6 +22,11 @@ function $SnifferProvider() {
|
|||
// IE8 compatible mode lies
|
||||
(!$window.document.documentMode || $window.document.documentMode > 7),
|
||||
hasEvent: function(event) {
|
||||
// IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have
|
||||
// it. In particular the event is not fired when backspace or delete key are pressed or
|
||||
// when cut operation is performed.
|
||||
if (event == 'input' && msie == 9) return false;
|
||||
|
||||
if (isUndefined(eventSupport[event])) {
|
||||
var divElm = $window.document.createElement('div');
|
||||
eventSupport[event] = 'on' + event in divElm;
|
||||
|
|
|
|||
|
|
@ -254,7 +254,7 @@ describe('ngModel', function() {
|
|||
expect(element.hasClass('ng-invalid-email')).toBe(true);
|
||||
|
||||
element.val('invalid-again');
|
||||
browserTrigger(element, $sniffer.hasEvent('input') ? 'input' : 'change');
|
||||
browserTrigger(element, ($sniffer.hasEvent('input')) ? 'input' : 'change');
|
||||
expect(element).toBeInvalid();
|
||||
expect(element).toBeDirty();
|
||||
expect(element.hasClass('ng-valid-email')).toBe(false);
|
||||
|
|
|
|||
|
|
@ -45,10 +45,10 @@ describe('$sniffer', function() {
|
|||
});
|
||||
|
||||
|
||||
it('should return true if "oninput" is present in a div element', function() {
|
||||
mockDivElement = {oninput: noop};
|
||||
it('should return true if "onchange" is present in a div element', function() {
|
||||
mockDivElement = {onchange: noop};
|
||||
|
||||
expect($sniffer.hasEvent('input')).toBe(true);
|
||||
expect($sniffer.hasEvent('change')).toBe(true);
|
||||
});
|
||||
|
||||
|
||||
|
|
@ -62,11 +62,19 @@ describe('$sniffer', function() {
|
|||
it('should only create the element once', function() {
|
||||
mockDivElement = {};
|
||||
|
||||
$sniffer.hasEvent('input');
|
||||
$sniffer.hasEvent('input');
|
||||
$sniffer.hasEvent('input');
|
||||
$sniffer.hasEvent('change');
|
||||
$sniffer.hasEvent('change');
|
||||
$sniffer.hasEvent('change');
|
||||
|
||||
expect(mockDocument.createElement).toHaveBeenCalledOnce();
|
||||
});
|
||||
|
||||
|
||||
it('should claim that IE9 doesn\'t have support for "oninput"', function() {
|
||||
// IE9 implementation is fubared, so it's better to pretend that it doesn't have the support
|
||||
mockDivElement = {oninput: noop};
|
||||
|
||||
expect($sniffer.hasEvent('input')).toBe((msie == 9) ? false : true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in a new issue