Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

fix(input[text]): composing function dosen't works properly in IE #16273

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/ng/directive/input.js
Original file line number Diff line number Diff line change
Expand Up @@ -1248,6 +1248,16 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
composing = true;
});

// Support: IE9+
element.on('compositionupdate', function(ev) {
// End composition when ev.data is empty string on 'compositionupdate' event.
// When the input de-focusses (e.g. by clicking away), IE triggers 'compositionupdate'
// instead of 'compositionend'.
if (isUndefined(ev.data) || ev.data === '') {
composing = false;
}
});

element.on('compositionend', function() {
composing = false;
listener();
Expand Down
18 changes: 18 additions & 0 deletions src/ngMock/browserTrigger.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,24 @@
evnt.keyCode = eventData.keyCode;
evnt.charCode = eventData.charCode;
evnt.which = eventData.which;
} else if (/composition/.test(eventType)) {
try {
evnt = new window.CompositionEvent(eventType, {
data: eventData.data
});
} catch (e) {
// Support: IE9+
evnt = window.document.createEvent('CompositionEvent', {});
evnt.initCompositionEvent(
eventType,
eventData.bubbles,
eventData.cancelable,
window,
eventData.data,
null
);
}

} else {
evnt = window.document.createEvent('MouseEvents');
x = x || 0;
Expand Down
14 changes: 14 additions & 0 deletions test/ng/directive/inputSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,20 @@ describe('input', function() {
browserTrigger(inputElm, 'compositionend');
expect($rootScope.name).toEqual('caitp');
});


it('should end composition on "compositionupdate" when event.data is ""', function() {
// This tests a bug workaround for IE9-11
// During composition, when an input is de-focussed by clicking away from it,
// the compositionupdate event is called with '', followed by a change event.
var inputElm = helper.compileInput('<input type="text" ng-model="name" name="alias" />');
browserTrigger(inputElm, 'compositionstart');
helper.changeInputValueTo('caitp');
expect($rootScope.name).toBeUndefined();
browserTrigger(inputElm, 'compositionupdate', {data: ''});
browserTrigger(inputElm, 'change');
expect($rootScope.name).toEqual('caitp');
});
});


Expand Down