前提・実現したいこと
DOMContentLoaded
イベント発生した時点で、
大量の要素に対し、イベントハンドラの登録や初期処理を行う
load()
(ユーザー定義) 処理を行っています。
これが完了すると、文書が整って見えるようになるのですが、
多少(5秒程度)、時間が掛かるので、
その間は画面全体に半透明のフィルターを発生させて、
ロード中であることを明示しています。
半透明のフィルターは、元々は表示されており(display: block;
)、
同じく、DOMContentLoaded
イベント内の最後で、
非表示(display: none
)にしています。
- webシステムなどではなく、ローカルで閲覧するhtmlファイルなのですが、
オリジナルの状態から、UI経由で文書の状態を変更したものを保存(ctrl + s)
したいケースが多々あります。
保存された状態のhtmlを閲覧しようとすると、半透明のフィルターは非表示
の状態で保存されているため、半透明のフィルターは表示されなくなってしまいます。
- 前置きが長くなりましたが、
ここで、一番最初の処理として、半透明のフィルターを再表示する
init()
(ユーザー定義) 処理を行い、再表示されるようにしたいのですが、
これが、うまくいきません。
- 下記していますが、
DOMContentLoaded
とloaded
イベントを分けて上手くいかなかったので、
原因が良く分かっていません。
なぜ、このようになってしまうのか、または、どのようにすればうまくいくのか
ご教示いただきたいです。
該当のソースコード
具体的なコードがなく、申し訳ないのですが・・・
html
1<head> 2 <style> 3 .no-disp-important { display: none !Important; } 4 </style> 5</head> 6<div id='loading'> 7</div> 8<div id='main'> 9</div> 10<script> 11(function() { 12 document.addEventListener('DOMContentLoaded', () => { 13 init(); // 半透明のフィルターを再表示 14 load(); // イベントハンドラの登録や初期処理 15 show(); // 半透明のフィルターを除去 16 }, false); 17}()); 18 19function init() { 20 const loading = document.getElementById('loading'); 21 loading.classList.remove('no-disp-important'); 22} 23 24function load() { 25 // 大量の要素に対し、イベントハンドラの登録や初期処理を行う 26 // 5秒程度掛かる 27 : 28} 29 30function show() { 31 const loading = document.getElementById('loading'); 32 loading.classList.add('no-disp-important'); 33} 34 35</script>
試したこと
- プロセスが同じでは無理かと思い、
DOMContentLoaded
、loaded
イベントで区別する - UIスレッドじゃないと意味ないのでは?と思いつつ、
スレッドを分ければいいのかと思い、非同期処理にしてみる。
js
1 document.addEventListener('DOMContentLoaded', () => { 2 new Promise((resolve, reject) => { 3 init(); 4 }); 5 }, false); 6 window.addEventListener('load', () => { 7 new Promise((resolve, reject) => { 8 load(); 9 resolve(); 10 }) 11 .then((resolve, reject) => { 12 show(); 13 }); 14 }, false);
- タイマーを使って待ち合わせてみる。
js
1 document.addEventListener('DOMContentLoaded', () => { 2 new Promise((resolve, reject) => { 3 init(); 4 }); 5 }, false); 6 window.addEventListener('load', () => { 7 new Promise((resolve, reject) => { 8 const waiting = function() { 9 const timeoutId = setTimeout(waiting, 1000); 10 const loading = document.getElementById('loading'); 11 if (!loading.classList.contains('no-disp-important')) { 12 clearTimeout(timeoutId); 13 } 14 } 15 waiting(); 16 resolve(); 17 }) 18 .then((resolve, reject) => { 19 return load(); 20 }) 21 .then((resolve, reject) => { 22 show(); 23 }); 24 }, false);
いずれの結果も同じで、フィルターを発生させることはできません
環境
- Microsoft Edge
回答1件
あなたの回答
tips
プレビュー