save-iframe-scroll-offset-when-display-none.sub.html (898B)
1 <!DOCTYPE html> 2 <div style="width: 10000px; height: 10000px"> 3 <!-- Adding <input> is to reproduce scroll offset reset when display:none --> 4 <input type="text"> 5 </div> 6 <script> 7 function postReplyMessage(target, frame_id, command) { 8 target.postMessage({ 9 command: command, 10 frame_id: frame_id, 11 scrollX: window.scrollX, 12 scrollY: window.scrollY 13 }, "*"); 14 } 15 16 function handleMessage(event) { 17 switch (event.data.command) { 18 case 'scrollTo': 19 window.scrollTo(event.data.scrollX, event.data.scrollY); 20 break; 21 case 'getScroll': 22 // No-op, just reply with current scroll position. 23 break; 24 default: 25 throw Error(`Unknown command: ${event.data.command}`); 26 break; 27 } 28 requestAnimationFrame(() => { 29 postReplyMessage(event.source, event.data.frame_id, event.data.command); 30 }); 31 } 32 33 window.addEventListener('message', handleMessage); 34 </script>