const AUTO_SCROLL = false
const btn = document.querySelector('#my-button')
const ara = document.querySelector('#my-textarea')
document.addEventListener('keydown', onKeyPress)
btn.addEventListener('click', simulateClick)
function onKeyPress(e) {
if (e.key === 'PageDown') {
ara.value += 'DOWN\n'
}
}
function simulateClick(e) {
// Scroll the document
if (AUTO_SCROLL) {
const documentHeight = Math.max(document.body.scrollHeight,
document.body.offsetHeight, document.documentElement.clientHeight,
document.documentElement.scrollHeight, document.documentElement.offsetHeight);
scrollIt(window.pageYOffset + (documentHeight * 0.25))
}
// Fire the event to handle the rest...
document.dispatchEvent(new KeyboardEvent('keydown', {
key: 'PageDown'
}))
}
/** Source: https://pawelgrzybek.com/page-scroll-in-vanilla-javascript/ */
function scrollIt(destination, duration = 200, easing = 'linear', callback) {
const easings = {
linear(t) {
return t;
},
easeInQuad(t) {
return t * t;
},
easeOutQuad(t) {
return t * (2 - t);
},
easeInOutQuad(t) {
return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
},
easeInCubic(t) {
return t * t * t;
},
easeOutCubic(t) {
return (--t) * t * t + 1;
},
easeInOutCubic(t) {
return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
},
easeInQuart(t) {
return t * t * t * t;
},
easeOutQuart(t) {
return 1 - (--t) * t * t * t;
},
easeInOutQuart(t) {
return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t;
},
easeInQuint(t) {
return t * t * t * t * t;
},
easeOutQuint(t) {
return 1 + (--t) * t * t * t * t;
},
easeInOutQuint(t) {
return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t;
}
};
const start = window.pageYOffset;
const startTime = 'now' in window.performance
? performance.now() : new Date().getTime();
const documentHeight = Math.max(document.body.scrollHeight,
document.body.offsetHeight, document.documentElement.clientHeight,
document.documentElement.scrollHeight, document.documentElement.offsetHeight);
const windowHeight = window.innerHeight ||
document.documentElement.clientHeight ||
document.getElementsByTagName('body')[0].clientHeight;
const destOffset = typeof destination === 'number'
? destination : destination.offsetTop;
const destOffScroll = Math.round(documentHeight - destOffset < windowHeight
? documentHeight - windowHeight : destOffset);
if ('requestAnimationFrame' in window === false) {
window.scroll(0, destOffScroll);
if (callback) {
callback();
}
return;
}
function scroll() {
const now = 'now' in window.performance ? performance.now() : new Date().getTime();
const time = Math.min(1, ((now - startTime) / duration));
const timeFunction = easings[easing](time);
window.scroll(0, Math.ceil((timeFunction * (destOffScroll - start)) + start));
if (window.pageYOffset === destOffScroll) {
if (callback) {
callback();
}
return;
}
requestAnimationFrame(scroll);
}
scroll();
}
#my-button {
position: fixed;
right: 4em;
top: 1.33em;
}
<textarea id="my-textarea" rows="100" cols="62"></textarea>
<button id="my-button">Button</button>