diff --git a/src/views/edit/index.vue b/src/views/edit/index.vue
index b9534025..b67efa28 100644
--- a/src/views/edit/index.vue
+++ b/src/views/edit/index.vue
@@ -55,8 +55,8 @@ getDataBySession()
 
 // 返回父窗口
 function back() {
-  opener.name = Date.now()
-  window.open(opener.location.href, opener.name)
+  window.opener.name = Date.now()
+  window.open(window.opener.location.href, window.opener.name)
 }
 
 // 导入json文本
@@ -71,7 +71,7 @@ async function importJSON() {
 }
 
 // 同步 [画布页失去焦点时同步数据到JSON页,JSON页Ctrl+S 时同步数据到画布页]
-opener.addEventListener(SavePageEnum.CHART, (e: any) => {
+window.opener.addEventListener(SavePageEnum.CHART, (e: any) => {
   setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [e.detail])
   content.value = JSON.stringify(e.detail, undefined, 2)
 })
@@ -87,14 +87,14 @@ addEventListener('blur', updateSync)
 
 // 同步更新
 function updateSync() {
-  if (!opener) {
+  if (!window.opener) {
     return window['$message'].error('源窗口已关闭,视图同步失败')
   }
   try {
     const detail = JSON.parse(content.value)
     delete detail.id
     // 保持id不变
-    opener.dispatchEvent(new CustomEvent(SavePageEnum.JSON, { detail }))
+    window.opener.dispatchEvent(new CustomEvent(SavePageEnum.JSON, { detail }))
   } catch (e) {
     window['$message'].error('内容格式有误')
     console.log(e)
diff --git a/src/views/preview/wrapper.vue b/src/views/preview/wrapper.vue
index 242910be..d209438a 100644
--- a/src/views/preview/wrapper.vue
+++ b/src/views/preview/wrapper.vue
@@ -1,5 +1,5 @@
 <template>
-  <Preview :key="key"></Preview>
+  <preview :key="key"></preview>
 </template>
 
 <script setup lang="ts">
@@ -16,10 +16,10 @@ let localStorageInfo: ChartEditStorageType = getSessionStorageInfo() as ChartEdi
 
 // 数据变更 -> 同步sessionStorage -> reload页面 (重新执行Mounted)
 ;[SavePageEnum.JSON, SavePageEnum.CHART].forEach((saveEvent: string) => {
-  opener.addEventListener(saveEvent, (e: any) => {
+  if (!window.opener) return
+  window.opener.addEventListener(saveEvent, (e: any) => {
     setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [{ ...e.detail, id: localStorageInfo.id }])
     key.value = Date.now()
   })
 })
-
 </script>
diff --git a/types/global.d.ts b/types/global.d.ts
index cceade09..1b11026a 100644
--- a/types/global.d.ts
+++ b/types/global.d.ts
@@ -7,6 +7,8 @@ interface Window {
   $vue: any
   // 键盘按键记录
   $KeyboardActive?: { [T: string]: boolean }
+  // 编辑 JSON 的存储对象
+  opener: any
 }
 
 declare type Recordable<T = any> = Record<string, T>