devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
78 lines (61 loc) • 2.06 kB
JavaScript
var $ = require("../../core/renderer"),
isDefined = require("../../core/utils/type").isDefined,
browser = require("../../core/utils/browser"),
domAdapter = require("../../core/dom_adapter");
var isFocusingOnCaretChange = browser.msie || browser.safari;
var getCaret = function getCaret(input) {
if (isObsoleteBrowser(input)) {
return getCaretForObsoleteBrowser(input);
}
return {
start: input.selectionStart,
end: input.selectionEnd
};
};
var setCaret = function setCaret(input, position) {
if (isObsoleteBrowser(input)) {
setCaretForObsoleteBrowser(input, position);
return;
}
if (!domAdapter.getBody().contains(input)) {
return;
}
input.selectionStart = position.start;
input.selectionEnd = position.end;
};
var isObsoleteBrowser = function isObsoleteBrowser(input) {
return !input.setSelectionRange;
};
var getCaretForObsoleteBrowser = function getCaretForObsoleteBrowser(input) {
var range = domAdapter.getSelection().createRange();
var rangeCopy = range.duplicate();
range.move('character', -input.value.length);
range.setEndPoint('EndToStart', rangeCopy);
return {
start: range.text.length,
end: range.text.length + rangeCopy.text.length
};
};
var setCaretForObsoleteBrowser = function setCaretForObsoleteBrowser(input, position) {
if (!domAdapter.getBody().contains(input)) {
return;
}
var range = input.createTextRange();
range.collapse(true);
range.moveStart("character", position.start);
range.moveEnd("character", position.end - position.start);
range.select();
};
var caret = function caret(input, position) {
input = $(input).get(0);
if (!isDefined(position)) {
return getCaret(input);
}
// NOTE: IE focuses element input after caret position has changed
if (isFocusingOnCaretChange && domAdapter.getActiveElement() !== input) {
return;
}
setCaret(input, position);
};
module.exports = caret;
;