瀏覽器子Tab能控制父Tab嗎

i5meng發表於2020-04-04

前言

疫情無情人有情,在疫情期間,在家窩了小一個月,回杭發現自己胖了幾斤。去年秋天的減肥之旅,付之東流。

話說回來,今年文章更新的頻率下降了,主要原因是部門老大給我安排了新的任務,讓我做主程,專案進度都得自己把控,包括測試和上線都要我去督促,所以就耽誤了學習了,不過我在開發過程中,解決了一個比較有趣的問題,這是早些年困擾過我的問題,這次解決了覺得比較有趣,就分享給大家。

分析需求

產品?來了一個需求,大概是這樣的。有一個列表頁面 A,列表的每一項都有一個編輯功能,點選編輯功能跳轉到新的頁面,然後編輯該項,結束之後點選確認按鈕,要把當前編輯頁面關閉,並且要保證列表頁面 A 重新整理,展示出最新的編輯情況,畫個示意圖如下。

瀏覽器子Tab能控制父Tab嗎

試問兩個 Tab 怎麼通訊呢,縱然你是神,你也得老老實實做如下操作:

瀏覽器子Tab能控制父Tab嗎

找到答案

經過一番搜尋,找到了一個比較這個需求的解決方案,那就是 window.opener 這個全域性屬性。先來介紹一下它。

opener 屬性是一個可讀可寫的屬性,可返回對建立該視窗的 Window 物件的引用。當使用 window.open() 開啟一個視窗,您可以使用此屬性返回來自目標視窗源(父)視窗的詳細資訊。 程式碼提示: window.opener.close() 將關閉源(父)視窗。

簡單的說,就是我現在可以通過在編輯頁面 B 通過 window.opener 拿到列表頁 A 的全域性物件。

再看看它的瀏覽器支援情況:

瀏覽器子Tab能控制父Tab嗎

資料來源於 www.caniuse.com 這個網站專門查詢一些瀏覽器對屬性的相容性。從圖片中可以看出 opener 的支援情況還是比較樂觀的,大多數瀏覽器都已支援。

那麼問題就變得簡單了,假設 A 頁面獲取資料的方法是 LoadData,那麼我將 LoadData 掛載到 A 頁面的一個全域性變數上,程式碼如下:

window._A_LOADDATA = LoadData;
複製程式碼

全域性變數一定要注意要規範一些,避免造成全域性變數的汙染,最好 A 頁面銷燬的時候,清除一下 window._A_LOADDATA

然後在 B 頁面,編輯完資訊提交儲存介面的回撥函式處呼叫 window.opener._A_LOADDATA 方法:

savaEdit().then({
  window.opener._A_LOADDATA()
  window.close()
})
複製程式碼

這樣執行 window.opener._A_LOADDATA() 後,列表頁 A 就會執行 LoadData 方法,重新整理當前頁面的資料,得到編輯後的結果。

總結

問題不難,但是希望大家能學到的是解決問題的這個過程,不要一有問題就去群裡問:“有大佬在嗎?幫我解決一下**問題”。我可以很明確的告訴你,身為大佬的我,鳥都不想鳥你(開個玩笑),自己去百度搜答案去吧。大多數問題搜尋引擎加上自己的一些分析和理解能力,都是可以迎刃而解的,實在解決不了,再去請求自己上司的幫助,相信他不會為難你。

相關文章