$.each(listOfModifiers, function (index, value) { fakeDivCssStyles += value + ':' + Util.getCssStyleValue(el, value) + ';'; });
exports.getPositionCoordinates = function (el, position, correctOptions) { var range = null, rects = null, selectionPosition = null, rect = null, isTextarea = el.tagName.toLowerCase() === 'textarea', isContentEditable = Util.isContentEditableElement(el), offset = Util.getOffsetPosition(el); //NOTE: we don't create fake div element for contentEditable elements //because we can get the selection dimensions directly if (isContentEditable) { range = Util.findDocument(el).createRange(); selectionPosition = ContentEditableHelper.calculateNodeAndOffsetByPosition(el, position); range.setStart(selectionPosition.node, Math.min(selectionPosition.offset, selectionPosition.node.length)); range.setEnd(selectionPosition.node, Math.min(selectionPosition.offset, selectionPosition.node.length)); rect = range.getClientRects()[0]; return rect ? correctRectangle(rect, correctOptions) : null; } //NOTE: for IE if (typeof el.createTextRange === "function") { range = el.createTextRange(); range.collapse(true); range.moveStart('character', position); range.moveEnd('character', position); range.collapse(true); rect = range.getBoundingClientRect(); return rect ? correctRectangle(rect, correctOptions) : null; } var $body = $(document).find('body'), bodyMargin = Util.getElementMargin($body), bodyLeft = null, bodyTop = null, elementMargin = Util.getElementMargin($(el)), elementTop = offset.top - elementMargin.top, elementLeft = offset.left - elementMargin.left, width = el.scrollWidth, $fakeDiv = $('<div></div>'), fakeDivCssStyles = 'white-space:pre-wrap;border-style:solid;', listOfModifiers = ['direction', 'font-family', 'font-size', 'font-size-adjust', 'font-variant', 'font-weight', 'font-style', 'letter-spacing', 'line-height', 'text-align', 'text-indent', 'text-transform', 'word-wrap', 'word-spacing', 'padding-top', 'padding-left', 'padding-right', 'padding-bottom', 'margin-top', 'margin-left', 'margin-right', 'margin-bottom', 'border-top-width', 'border-left-width', 'border-right-width', 'border-bottom-width']; if (Util.getCssStyleValue($body[0], 'position') === 'absolute') { elementLeft -= bodyMargin.left; elementTop -= bodyMargin.top; bodyLeft = Util.getCssStyleValue($body[0], 'left'); if (bodyLeft !== 'auto') elementLeft -= parseInt(bodyLeft.replace('px', '')); bodyTop = Util.getCssStyleValue($body[0], 'top'); if (bodyTop !== 'auto') elementTop -= parseInt(bodyTop.replace('px', '')); } $.each(listOfModifiers, function (index, value) { fakeDivCssStyles += value + ':' + Util.getCssStyleValue(el, value) + ';'; }); $fakeDiv.appendTo($body); try { $fakeDiv.css({ cssText: fakeDivCssStyles, position: 'absolute', top: elementTop, left: elementLeft, width: width, height: el.scrollHeight }); $fakeDiv[0].textContent = !el.value.length ? ' ' : el.value; range = document.createRange(); //B254723 range.setStart($fakeDiv[0].firstChild, Math.min(position, el.value.length)); range.setEnd($fakeDiv[0].firstChild, Math.min(position, el.value.length)); if (isTextarea) { rects = range.getClientRects(); rect = range.getBoundingClientRect(); if (rect.width === 0 && rect.height === 0) rect = rects[0]; } else rect = range.getClientRects()[0]; $fakeDiv.remove(); } catch (err) { $fakeDiv.remove(); return {}; } return rect ? correctRectangle(rect, correctOptions) : null; };