前提・実現したいこと
以下OSSの編集を行っています。
TakamiChie/Re-VIEW-Preview: Tool to live Preview any Re:VIEW format document
このソフトでは、PythonのPyWebViewモジュールを使って、HTMLでレンダリングしたGUIを表示、その中にiframeで他ドキュメント(ここではRe:VIEWで生成したHTMLドキュメント)を読み込み表示する という処理を行っています。
なお、PyWebViewのHTMLレンダリングエンジンは、Windowsの場合Trident(IE11)となります。
このソフトで、iframeにて表示中のドキュメントが再読込されたとき、スクロール位置を維持する機能を実装したいと考えています。
発生している問題・エラーメッセージ
PyWebViewないしIE11の以下の制約により、どの方法でもスクロール位置を保存・復元することができません。
iframe内で表示しているドキュメントで、スクロール位置を保存しようとした場合
- IE11はローカルHTMLを読み込んでいる場合、localStorageないしsessionStorageが使用できない
- PyWebViewでは子ウィンドウから
window.parent.***
として親ウィンドウを参照することができない(「アクセスが拒否されました」というエラーが表示される)
iframeを持つドキュメント(PyWebView#load_html()で表示しているドキュメント)でスクロール位置を保存しようとした場合
- PyWebViewでは、iframeのcontentDocumentプロパティが参照できない(「アクセスが拒否されました」というエラーが表示される)
PyWebViewではHTMLドキュメントの情報にアクセスする方法がwebview.evaluatejs()
メソッドしかないため、HTML上でできないことをPython上で実現することもできない状況です。
該当のソースコード・試したこと
html
1<!-- main.html --> 2<!DOCTYPE html> 3<html lang="ja"> 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <link rel="stylesheet" href="../node_modules/bootstrap-honoka/dist/css/bootstrap.css"> 8 <link rel="stylesheet" href="../html/main.css"> 9 <title>Re:View Preview</title> 10</head> 11<body> 12 <header class="navbar navbar-expand-lg navbar-light bg-primary"> 13 <h1 class="navbar-brand">Preview</h1> 14 15 <ul class="navbar-nav mr-auto"> 16 <li class="nav-item" id="refresh_view"><a class="nav-link">🔄</a></li> 17 </ul> 18 <form class="form-inline my-2 my-lg-0"> 19 <select class="form-control" id="review-file" aria-label="file"></select> 20 </form> 21 </header> 22 <div class="container-fluid"> 23 <iframe id="preview_frame" src="../html/loading.html"></iframe> 24 </div> 25 <script src="../html/main.js"></script> 26 <script src="../node_modules/es6-promise/dist/es6-promise.js"></script> 27 <script src="../node_modules/jquery/dist/jquery.js"></script> 28 <script src="../node_modules/bootstrap-honoka/dist/js/bootstrap.js"></script> 29</body> 30</html>
js
1// main.js 2let current; 3// 以下の行が、IE上ではエラーにならないが、PyWebViewで実行するとエラーになる 4document.getElementById("preview_frame").contentDocument.addEventListener("scroll", function (e) { 5 current = document.getElementById("preview_frame").contentDocument.documentElement.scrollTop; 6});
html
1<!-- loading.html --> 2<!DOCTYPE html> 3<html> 4<head> 5 <!-- reference from: http://tobiasahlin.com/spinkit/ --> 6 <meta charset="utf-8"> 7 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 8 <title>Loading</title> 9</head> 10<body> 11 Loading... 12 13<script src='D:\...\review_preview\html\frame.js'></script></body> 14</html>
js
1// frame.js 2document.addEventListener("scroll", function (e) { 3 // 以下の行で、「SCRIPT5007: 未定義または NULL 参照のプロパティ 'setItem' は取得できません」というメッセージが表示される 4 localStorage.setItem("pos", document.documentElement.scrollTop); 5 // 以下の行が、IE上ではエラーにならないが、PyWebViewで実行するとエラーになる 6 window.parent.pos = document.documentElement.scrollTop; 7});
補足情報(FW/ツールのバージョンなど)
- Python: 3.6.6(3.7だとPyWebViewインストール時にエラーが頻発したため3.6.6としました)
- PyWebView: 2.4
- bootstrap-honoka: 4.3.1
- Windows: 10 Ver 1809 Build 17763.316

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。