[FIX #14628] Don’t use preventDefault() on IE unless the user pressed enter (#14667)

* Don’t use prevent default on IE unless the user pressed enter

* Implament ie fix on number fields too

* share the ie detection lib

* change file names and export types
This commit is contained in:
Matt Apperson 2017-10-30 17:24:45 -04:00 committed by Matt Apperson
parent e765e3b967
commit cd9437b353
3 changed files with 35 additions and 4 deletions

View file

@ -1,10 +1,12 @@
import _ from 'lodash';
import { detectIE } from './detect_ie';
export default (handleChange) => {
return (name, defaultValue) => (e) => {
e.preventDefault();
if (!detectIE() || e.keyCode === 13) e.preventDefault();
const value = Number(_.get(e, 'target.value', defaultValue));
if (_.isFunction(handleChange)) {
return handleChange({ [name]: value });
}
};
};
};

View file

@ -1,10 +1,14 @@
import _ from 'lodash';
import { detectIE } from './detect_ie';
export default (handleChange) => {
return (name, defaultValue) => (e) => {
e.preventDefault();
// IE preventDefault breaks input, but we still need top prevent enter from being pressed
if (!detectIE() || e.keyCode === 13) e.preventDefault();
const value = _.get(e, 'target.value', defaultValue);
if (_.isFunction(handleChange)) {
return handleChange({ [name]: value });
}
};
};
};

View file

@ -0,0 +1,25 @@
export function detectIE() {
const ua = window.navigator.userAgent;
const msie = ua.indexOf('MSIE ');
if (msie > 0) {
// IE 10 or older => return version number
return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
}
const trident = ua.indexOf('Trident/');
if (trident > 0) {
// IE 11 => return version number
const rv = ua.indexOf('rv:');
return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
}
const edge = ua.indexOf('Edge/');
if (edge > 0) {
// Edge (IE 12+) => return version number
return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
}
// other browser
return false;
}