diff --git a/assets/js/theme.js b/assets/js/theme.js index 7e4ef0dd..a3451c4d 100644 --- a/assets/js/theme.js +++ b/assets/js/theme.js @@ -586,11 +586,14 @@ class FixIt { this._echartsArr[i].dispose(); } this._echartsArr = []; + const stagingDOM = this.util.getStagingDOM() this.util.forEach(document.getElementsByClassName('echarts'), ($echarts) => { const chart = echarts.init($echarts, this.isDark ? 'dark' : 'light', { renderer: 'svg' }); - chart.setOption(JSON.parse(this.data[$echarts.id])); + stagingDOM.stage($echarts.querySelector('template').content.cloneNode(true)); + chart.setOption(stagingDOM.contentAsJson()); this._echartsArr.push(chart); }); + stagingDOM.destroy(); }); this.switchThemeEventSet.add(this._echartsOnSwitchTheme); this._echartsOnSwitchTheme(); @@ -672,17 +675,13 @@ class FixIt { acc[group].push(ele); return acc; }, {}); - const stagingElement = document.createElement('div') - stagingElement.style.display = 'none'; - document.body.appendChild(stagingElement); + const stagingDOM = this.util.getStagingDOM() Object.values(groupMap).forEach((group) => { const typeone = (i) => { const typeitElement = group[i]; const singleLoop = typeitElement.dataset.loop; - // get the content of the typed element - stagingElement.innerHTML = ''; - stagingElement.appendChild(typeitElement.querySelector('template').content.cloneNode(true)); + stagingDOM.stage(typeitElement.querySelector('template').content.cloneNode(true)); // for shortcodes usage let targetEle = typeitElement.firstElementChild // for system elements usage @@ -690,10 +689,9 @@ class FixIt { typeitElement.innerHTML = ''; targetEle = typeitElement } - const typedContents = stagingElement.querySelector('pre')?.innerHTML || stagingElement.innerHTML // create a new instance of TypeIt for each element const instance = new TypeIt(targetEle, { - strings: typedContents, + strings: stagingDOM.$el.querySelector('pre')?.innerHTML || stagingDOM.contentAsHtml(), speed: speed, lifeLike: true, cursorSpeed: cursorSpeed, @@ -716,7 +714,7 @@ class FixIt { }; typeone(0); }); - document.body.removeChild(stagingElement); + stagingDOM.destroy(); } } diff --git a/assets/js/util.js b/assets/js/util.js index 13ba70de..ea8e8167 100644 --- a/assets/js/util.js +++ b/assets/js/util.js @@ -55,4 +55,34 @@ export default class Util { behavior: 'smooth' }); } + + /** + * get a hidden element for temporary use + * @returns {Object} { $el: Element, destroy: Function } + */ + getStagingDOM() { + const stagingElement = document.createElement('div') + stagingElement.style.display = 'none'; + document.body.appendChild(stagingElement); + + return { + $el: stagingElement, + stage(dom) { + stagingElement.innerHTML = ''; + stagingElement.appendChild(dom); + }, + contentAsHtml() { + return stagingElement.innerHTML; + }, + contentAsText() { + return stagingElement.innerText; + }, + contentAsJson() { + return JSON.parse(stagingElement.innerHTML); + }, + destroy() { + document.body.removeChild(stagingElement); + } + } + } } diff --git a/layouts/shortcodes/echarts.html b/layouts/shortcodes/echarts.html index bb064f6a..eba0d23d 100644 --- a/layouts/shortcodes/echarts.html +++ b/layouts/shortcodes/echarts.html @@ -1,6 +1,8 @@ {{- $content := .Inner | transform.Unmarshal | jsonify -}} -{{- $id := dict "Content" $content "Scratch" .Page.Scratch | partial "function/id.html" -}} {{- $width := cond .IsNamedParams (.Get "width") (.Get 0) | default "100%" -}} {{- $height := cond .IsNamedParams (.Get "height") (.Get 1) | default "30rem" -}} -
+{{- $attrs := printf `style="width: %v; height: %v;"` $width $height -}} +