mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-27 12:07:19 +00:00
Merge pull request #1933 from felixhayashi/fix/scrolling
Auto-height fix for text area which is contained in a scroll container
This commit is contained in:
commit
ccf6edb940
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user