Interact.js IFRAME bug
by Maksim Kachurin
HTML
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/interact.js"></script>
<iframe id="FileFrame" src="about:blank" width="100%" height="100%"></iframe>
<script type="text/javascript">
var doc = document.getElementById('FileFrame').contentWindow.document;
doc.open();
doc.write(`<html><head><title></title><style>
.drag-rotate {
width: 25%;
min-height: 6.5em;
margin: 10%;
background-color: #29e;
color: white;
border-radius: 0.75em;
padding: 4%;
transform: rotate(0);
transform-origin: center center;
user-select: none;
touch-action: none;
}
</style></head>
<body>
<div class="container"></div>
</body>
</html>`);
doc.close();
</script>
CSS
iframe {
width: 400px;
height: 420px;
}
JavaScript
/* BUG */
const iframeDoc = document.getElementById('FileFrame').contentWindow.document;
const container = iframeDoc.querySelector('.container');
// is it work
const dragRotateSelf = iframeDoc.createElement('div');
const dragRotateImport = iframeDoc.importNode(document.createElement('div'));
// is it not work
const dragRotateParent = document.createElement('div');
const dragRotateAdopt = iframeDoc.adoptNode(document.createElement('div'));
dragRotateSelf.className = 'drag-rotate';
dragRotateSelf.innerHTML = `
<p> SELF (ok) </p>
`;
dragRotateImport.className = 'drag-rotate';
dragRotateImport.innerHTML = `
<p> IMPORT (ok) </p>
`;
dragRotateAdopt.className = 'drag-rotate';
dragRotateAdopt.innerHTML = `
<p> ADOPT (fail) </p>
`;
dragRotateParent.className = 'drag-rotate';
dragRotateParent.innerHTML = `
<p> PARENT (fail) </p>
`;
// Add element into container
container.appendChild(dragRotateSelf);
container.appendChild(dragRotateParent);
container.appendChild(dragRotateAdopt);
container.appendChild(dragRotateImport);
/* ROTATE DEMO */
interact('.drag-rotate', { context: iframeDoc })
.draggable({
onstart: function(event) {
const element = event.target;
const rect = element.getBoundingClientRect();
// store the center as the element has css `transform-origin: center center`
element.dataset.centerX = rect.left + rect.width / 2;
element.dataset.centerY = rect.top + rect.height / 2;
// get the angle of the element when the drag starts
element.dataset.angle = getDragAngle(event);
},
onmove: function(event) {
var element = event.target;
var center = {
x: parseFloat(element.dataset.centerX) || 0,
y: parseFloat(element.dataset.centerY) || 0,
};
var angle = getDragAngle(event);
// update transform style on dragmove
element.style.transform =...