Skip to content

Instantly share code, notes, and snippets.

@ccapndave
Last active October 12, 2017 10:38
Show Gist options
  • Save ccapndave/84a2e125b8d9443e438aa97311138834 to your computer and use it in GitHub Desktop.
Save ccapndave/84a2e125b8d9443e438aa97311138834 to your computer and use it in GitHub Desktop.
function clickjackElement(doc: Document, element: HTMLElement, pollingInterval: number = 500) {
const clickjacker = document.createElement("span");
clickjacker.style.position = "absolute";
clickjacker.style.cursor = "pointer";
clickjacker.style.backgroundColor = "red";
clickjacker.style.opacity = "0.5";
element.parentNode.insertBefore(clickjacker, element.nextSibling);
const position = () => {
const elementRect = element.getBoundingClientRect();
const leftDiff = element.offsetLeft - clickjacker.offsetLeft;
const topDiff = element.offsetTop - clickjacker.offsetTop;
Object.assign(clickjacker.style, {
width: `${elementRect.width}px`,
height: `${elementRect.height}px`,
transform: `translate(${leftDiff}px, ${topDiff}px)`
});
};
const positionElement$ =
Rx.Observable.merge(
Rx.Observable.just(true),
Rx.Observable.fromEvent(window, "resize"),
Rx.Observable.interval(pollingInterval)
).throttle(10);
const positionDisposable = positionElement$.subscribe(position);
const dispose = () => {
positionDisposable.dispose();
if (clickjacker) clickjacker.parentNode.removeChild(clickjacker);
};
return {
clickjacker,
dispose
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment