diff --git a/core/modules/widgets/edit-text.js b/core/modules/widgets/edit-text.js index 835e0ce9d..975547890 100644 --- a/core/modules/widgets/edit-text.js +++ b/core/modules/widgets/edit-text.js @@ -211,18 +211,31 @@ EditTextWidget.prototype.updateEditorDomNode = function(text) { } }; +/* +Get the first parent element that has scrollbars or use the body as fallback. +*/ +EditTextWidget.prototype.getScrollContainer = function(el) { + while(el.parentNode) { + el = el.parentNode; + if(el.scrollTop) { + return el; + } + } + return this.document.body; +}; + /* Fix the height of textareas to fit their content */ EditTextWidget.prototype.fixHeight = function() { - var self = this, - domNode = this.domNodes[0]; + var domNode = this.domNodes[0]; if(this.editAutoHeight && domNode && !domNode.isTiddlyWikiFakeDom && this.editTag === "textarea") { // Resize the textarea to fit its content, preserving scroll position - var scrollPosition = $tw.utils.getScrollPosition(), - scrollTop = scrollPosition.y; - // Measure the specified minimum height - domNode.style.height = self.editMinHeight; + // Get the scroll container and register the current scroll position + var container = this.getScrollContainer(domNode), + scrollTop = container.scrollTop; + // Measure the specified minimum height + domNode.style.height = this.editMinHeight; var minHeight = domNode.offsetHeight; // Set its height to auto so that it snaps to the correct height domNode.style.height = "auto"; @@ -230,12 +243,11 @@ EditTextWidget.prototype.fixHeight = function() { var newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,minHeight); // Only try to change the height if it has changed if(newHeight !== domNode.offsetHeight) { - domNode.style.height = newHeight + "px"; + domNode.style.height = newHeight + "px"; // Make sure that the dimensions of the textarea are recalculated $tw.utils.forceLayout(domNode); - // Check that the scroll position is still visible before trying to scroll back to it - scrollTop = Math.min(scrollTop,self.document.body.scrollHeight - window.innerHeight); - window.scrollTo(scrollPosition.x,scrollTop); + // Set the container to the position we registered at the beginning + container.scrollTop = scrollTop; } } };