Merge pull request #1933 from felixhayashi/fix/scrolling

Auto-height fix for text area which is contained in a scroll container
print-window-tiddler
Jeremy Ruston 2015-12-22 14:08:56 +00:00
commit ccf6edb940
1 zmienionych plików z 22 dodań i 10 usunięć

Wyświetl plik

@ -213,18 +213,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 Fix the height of textareas to fit their content
*/ */
EditTextWidget.prototype.fixHeight = function() { EditTextWidget.prototype.fixHeight = function() {
var self = this, var domNode = this.domNodes[0];
domNode = this.domNodes[0];
if(this.editAutoHeight && domNode && !domNode.isTiddlyWikiFakeDom && this.editTag === "textarea") { if(this.editAutoHeight && domNode && !domNode.isTiddlyWikiFakeDom && this.editTag === "textarea") {
// Resize the textarea to fit its content, preserving scroll position // Resize the textarea to fit its content, preserving scroll position
var scrollPosition = $tw.utils.getScrollPosition(), // Get the scroll container and register the current scroll position
scrollTop = scrollPosition.y; var container = this.getScrollContainer(domNode),
// Measure the specified minimum height scrollTop = container.scrollTop;
domNode.style.height = self.editMinHeight; // Measure the specified minimum height
domNode.style.height = this.editMinHeight;
var minHeight = domNode.offsetHeight; var minHeight = domNode.offsetHeight;
// Set its height to auto so that it snaps to the correct height // Set its height to auto so that it snaps to the correct height
domNode.style.height = "auto"; domNode.style.height = "auto";
@ -232,12 +245,11 @@ EditTextWidget.prototype.fixHeight = function() {
var newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,minHeight); var newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,minHeight);
// Only try to change the height if it has changed // Only try to change the height if it has changed
if(newHeight !== domNode.offsetHeight) { if(newHeight !== domNode.offsetHeight) {
domNode.style.height = newHeight + "px"; domNode.style.height = newHeight + "px";
// Make sure that the dimensions of the textarea are recalculated // Make sure that the dimensions of the textarea are recalculated
$tw.utils.forceLayout(domNode); $tw.utils.forceLayout(domNode);
// Check that the scroll position is still visible before trying to scroll back to it // Set the container to the position we registered at the beginning
scrollTop = Math.min(scrollTop,self.document.body.scrollHeight - window.innerHeight); container.scrollTop = scrollTop;
window.scrollTo(scrollPosition.x,scrollTop);
} }
} }
}; };