JavaScript使用window.open打開(kāi)的頁(yè)面進(jìn)行數(shù)據(jù)交互的三種方案
場(chǎng)景: 在一個(gè)新增物資的頁(yè)面上,我要點(diǎn)擊按鈕,執(zhí)行 window.open()打開(kāi)人員錄入的工單。在人員工單上,我要填寫完信息,點(diǎn)擊提交按鈕,就會(huì)產(chǎn)生一個(gè)人員申請(qǐng)的id出來(lái)。在提交完以后,我想要這個(gè)人員申請(qǐng)的id傳到新增物資的頁(yè)面上來(lái)。
解決方案:
使用 window.open() 打開(kāi)新頁(yè)面,這意味創(chuàng)建了一個(gè)完全獨(dú)立的瀏覽器窗口/標(biāo)簽頁(yè),與原頁(yè)面是兩個(gè)獨(dú)立的文檔環(huán)境。
這兩個(gè)頁(yè)面的通信方式如下:
方案一:使用 postMessage API(推薦)
這是跨窗口通信的標(biāo)準(zhǔn)方式:
javascript
// 在原頁(yè)面打開(kāi)新窗口時(shí)
const newWindow = window.open(`/page/tickets/visitor/new`, '_blank');
// 監(jiān)聽(tīng)來(lái)自新窗口的消息
window.addEventListener('message', (event) => {
// 驗(yàn)證消息來(lái)源(安全考慮)
if (event.origin !== window.location.origin) return;
if (event.data.type === 'PERSON_CREATED') {
const { id } = event.data.payload;
// 更新頁(yè)面上的 ID 顯示
setId(id);
}
});
// 在新頁(yè)面提交成功后
// window.opener 指向打開(kāi)當(dāng)前窗口的窗口
window.opener.postMessage({
type: 'PERSON_CREATED',
payload: { id: newPersonId }
}, window.location.origin);
// 關(guān)閉當(dāng)前窗口
window.close();
方案二:使用 localStorage + 輪詢(適用于不能修改新頁(yè)面的情況)
javascript
// 在原頁(yè)面中
const newWindow = window.open(`/page/tickets/visitor/new`, '_blank');
// 輪詢檢查 localStorage 中是否有新創(chuàng)建的 ID
const checkForNewId = setInterval(() => {
const newPersonData = localStorage.getItem('newPersonCreated');
if (newPersonData) {
const { id } = JSON.parse(newPersonData);
setId(id);
localStorage.removeItem('newPersonCreated');
clearInterval(checkForNewId);
}
}, 1000);
// 在新頁(yè)面提交成功后
localStorage.setItem('newPersonCreated', JSON.stringify({ id: newPersonId }));
window.close();
方案三:URL 參數(shù)傳遞 + 頁(yè)面刷新監(jiān)聽(tīng)
javascript
// 在原頁(yè)面中
const newWindow = window.open(`/page/tickets/visitor/new`, '_blank');
// 監(jiān)聽(tīng)新窗口關(guān)閉事件
const checkWindowClosed = setInterval(() => {
if (newWindow.closed) {
// 檢查是否創(chuàng)建了新人員
const newPersonId = sessionStorage.getItem('newPersonId');
if (newPersonId) {
setId(newPersonId);
sessionStorage.removeItem('newPersonId');
}
clearInterval(checkWindowClosed);
}
}, 500);
// 在新頁(yè)面提交成功后
sessionStorage.setItem('newPersonId', newPersonId);
window.close();
對(duì)于跨窗口通信場(chǎng)景,我最推薦使用方案一(postMessage API) ,因?yàn)椋?/p>
- 它是現(xiàn)代瀏覽器提供的標(biāo)準(zhǔn)跨窗口通信方式
- 安全性更好(可以驗(yàn)證消息來(lái)源)
- 實(shí)時(shí)性更強(qiáng)(不需要輪詢)
- 符合 Web API 的最佳實(shí)踐
根據(jù)你項(xiàng)目的情況和安全要求,選擇最適合的方案即可。
到此這篇關(guān)于JavaScript使用window.open打開(kāi)的頁(yè)面進(jìn)行數(shù)據(jù)交互的三種方案的文章就介紹到這了,更多相關(guān)JavaScript window.open頁(yè)面進(jìn)行數(shù)據(jù)交互內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于javascript實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘效果
這篇文章主要為大家詳細(xì)介紹了基于javascript實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘效果的相關(guān)資料,動(dòng)態(tài)顯示系統(tǒng)當(dāng)前時(shí)間,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02
JavaScript實(shí)現(xiàn)模塊懶加載的幾種方式
JavaScript 中的模塊懶加載是一種優(yōu)化加載性能的技術(shù),其核心思想是將某些模塊的加載延遲到實(shí)際需要時(shí)才進(jìn)行,而不是在應(yīng)用初始化階段一次性加載所有模塊,本文給大家總結(jié)了JavaScript實(shí)現(xiàn)模塊懶加載的幾種方式,需要的朋友可以參考下2025-08-08
不間斷循環(huán)滾動(dòng)效果的實(shí)例代碼(必看篇)
下面小編就為大家?guī)?lái)一篇不間斷循環(huán)滾動(dòng)效果的實(shí)例代碼(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10
javascript中數(shù)組的sort()方法的使用介紹
數(shù)組的sort()方法用于排序,在本文將為大家介紹下javascript中sort()方法的具體使用2013-12-12
比較詳細(xì)的javascript對(duì)象的property和prototype是什么一種關(guān)系
比較詳細(xì)的javascript對(duì)象的property和prototype是什么一種關(guān)系...2007-08-08
javascript權(quán)威指南 學(xué)習(xí)筆記之javascript數(shù)據(jù)類型
JavaScript中允許使用三種基本數(shù)據(jù)類型 數(shù)字,文本字符和布爾值。其中數(shù)字包括符點(diǎn)數(shù).此外,它還支持兩種小數(shù)據(jù)類型 -null(空)和undefined(未定義),該兩種小數(shù)據(jù)類型,它們各自只定義了一個(gè)值 。2011-09-09
JS判斷來(lái)路是否是百度等搜索索引進(jìn)行彈窗或自動(dòng)跳轉(zhuǎn)的實(shí)現(xiàn)代碼
這篇文章主要介紹了JS判斷來(lái)路是否是百度等搜索索引進(jìn)行彈窗或自動(dòng)跳轉(zhuǎn)的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10
利用Vconsole和Fillder進(jìn)行移動(dòng)端抓包調(diào)試方法
這篇文章主要介紹了利用Vconsole和Fillder進(jìn)行移動(dòng)端抓包調(diào)試,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03

