最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript使用window.open打開(kāi)的頁(yè)面進(jìn)行數(shù)據(jù)交互的三種方案

 更新時(shí)間:2025年10月17日 10:47:42   作者:snow來(lái)了  
本文主要介紹了在通過(guò) window.open 打開(kāi)新頁(yè)面后,如何實(shí)現(xiàn)與原頁(yè)面的數(shù)據(jù)交互,主要推薦使用 postMessage API 進(jìn)行跨窗口通信,同時(shí)還提供了 localStorage+輪詢和URL參數(shù)傳遞等備選方案,并分析了各自優(yōu)缺點(diǎn),需要的朋友可以參考下

場(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>

  1. 它是現(xiàn)代瀏覽器提供的標(biāo)準(zhǔn)跨窗口通信方式
  2. 安全性更好(可以驗(yàn)證消息來(lái)源)
  3. 實(shí)時(shí)性更強(qiáng)(不需要輪詢)
  4. 符合 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)文章

最新評(píng)論

九江县| 金华市| 德令哈市| 梓潼县| 新密市| 伊金霍洛旗| 连山| 崇阳县| 晋州市| 永靖县| 山东| 长子县| 鹤壁市| 延津县| 武定县| 扶风县| 措美县| 裕民县| 双峰县| 靖边县| 博罗县| 滨州市| 高台县| 大方县| 普格县| 梧州市| 微山县| 高台县| 崇仁县| 旅游| 林芝县| 历史| 定日县| 宁晋县| 新晃| 高州市| 清河县| 利川市| 聂拉木县| 普洱| 永康市|