成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

兩個(gè)瀏覽器窗口間通信總結(jié)

Shonim / 3029人閱讀

摘要:兩個(gè)瀏覽器窗口間通信總結(jié)一個(gè)窗口更新,另一個(gè)窗口監(jiān)聽對象的事件,來實(shí)現(xiàn)通信。通過窗口的屬性來指定哪些窗口能接收到消息事件,其值可以是字符串表示無限制或者一個(gè)。父窗口先打開一個(gè)子窗口,載入一個(gè)不同源的網(wǎng)頁,該網(wǎng)頁將信息寫入屬性。

兩個(gè)瀏覽器窗口間通信總結(jié) 1、localStorage

一個(gè)窗口更新localStorage,另一個(gè)窗口監(jiān)聽window對象的”storage”事件,來實(shí)現(xiàn)通信。
注:兩個(gè)頁面要同源(URL的協(xié)議、域名和端口相同)

// 本窗口的設(shè)值代碼
localStorage.setItem("aaa", (Math.random()*10).toString())

// 其他窗口監(jiān)聽storage事件
window.addEventListener("storage", function (e) {
  console.log(e)
  console.log(e.newValue)
})
2、WebSocket

所有的WebSocket都監(jiān)聽同一個(gè)服務(wù)器地址,利用send發(fā)送消息,利用onmessage獲取消息的變化,不僅能窗口,還能跨瀏覽器,兼容性最佳,只是需要消耗點(diǎn)服務(wù)器資源。

var ws = new WebSocket("ws://localhost:3000/")
ws.onopen = function (event) {
  // 或者把此方法注冊到其他事件中,即可與其他服務(wù)器通信
  ws.send({now : Date.now()}); // 通過服務(wù)器中轉(zhuǎn)消息
};
ws.onmessage = function (event) {
  // 消費(fèi)消息
  console.log(event.data);
}
3、postMessage

借助iframe 或 window.open
回顧一下API

otherWindow.postMessage(message, targetOrigin, [transfer]);

otherWindow
其他窗口的一個(gè)引用,比如iframe的contentWindow屬性、執(zhí)行window.open返回的窗口對象、或者是命名過或數(shù)值索引的window.frames。

message
將要發(fā)送到其他 window的數(shù)據(jù)。它將會(huì)被結(jié)構(gòu)化克隆算法序列化。這意味著你可以不受什么限制的將數(shù)據(jù)對象安全的傳送給目標(biāo)窗口而無需自己序列化。

targetOrigin
通過窗口的origin屬性來指定哪些窗口能接收到消息事件,其值可以是字符串""(表示無限制)或者一個(gè)URI。在發(fā)送消息的時(shí)候,如果目標(biāo)窗口的協(xié)議、主機(jī)地址或端口這三者的任意一項(xiàng)不匹配targetOrigin提供的值,那么消息就不會(huì)被發(fā)送;只有三者完全匹配,消息才會(huì)被發(fā)送。這個(gè)機(jī)制用來控制消息可以發(fā)送到哪些窗口;例如,當(dāng)用postMessage傳送密碼時(shí),這個(gè)參數(shù)就顯得尤為重要,必須保證它的值與這條包含密碼的信息的預(yù)期接受者的origin屬性完全一致,來防止密碼被惡意的第三方截獲。如果你明確的知道消息應(yīng)該發(fā)送到哪個(gè)窗口,那么請始終提供一個(gè)有確切值的targetOrigin,而不是。不提供確切的目標(biāo)將導(dǎo)致數(shù)據(jù)泄露到任何對數(shù)據(jù)感興趣的惡意站點(diǎn)。

transfer 可選
是一串和message 同時(shí)傳遞的 Transferable 對象. 這些對象的所有權(quán)將被轉(zhuǎn)移給消息的接收方,而發(fā)送一方將不再保有所有權(quán)。

/*
 * A窗口的域名是,以下是A窗口的script標(biāo)簽下的代碼:
 */

var popup = window.open(...popup details...);

// 如果彈出框沒有被阻止且加載完成

// 這行語句沒有發(fā)送信息出去,即使假設(shè)當(dāng)前頁面沒有改變location(因?yàn)閠argetOrigin設(shè)置不對)
popup.postMessage("The user is "bob" and the password is "secret"",
                  "https://secure.example.net");

// 假設(shè)當(dāng)前頁面沒有改變location,這條語句會(huì)成功添加message到發(fā)送隊(duì)列中去(targetOrigin設(shè)置對了)
popup.postMessage("hello there!", "http://example.org");

function receiveMessage(event)
{
  // 我們能相信信息的發(fā)送者嗎?  (也許這個(gè)發(fā)送者和我們最初打開的不是同一個(gè)頁面).
  if (event.origin !== "http://example.org")
    return;

  // event.source 是我們通過window.open打開的彈出頁面 popup
  // event.data 是 popup發(fā)送給當(dāng)前頁面的消息 "hi there yourself!  the secret response is: rheeeeet!"
}
window.addEventListener("message", receiveMessage, false);


/*
 * 彈出頁 popup 域名是,以下是script標(biāo)簽中的代碼:
 */

//當(dāng)A頁面postMessage被調(diào)用后,這個(gè)function被addEventListenner調(diào)用
function receiveMessage(event)
{
  // 我們能信任信息來源嗎?
  if (event.origin !== "http://example.com:8080")
    return;

  // event.source 就當(dāng)前彈出頁的來源頁面
  // event.data 是 "hello there!"

  // 假設(shè)你已經(jīng)驗(yàn)證了所受到信息的origin (任何時(shí)候你都應(yīng)該這樣做), 一個(gè)很方便的方式就是把enent.source
  // 作為回信的對象,并且把event.origin作為targetOrigin
  event.source.postMessage("hi there yourself!  the secret response " +
                           "is: rheeeeet!",
                           event.origin);
}

window.addEventListener("message", receiveMessage, false);
4、cookie + setInterval【差】

在頁面A設(shè)置一個(gè)使用?setInterval?定時(shí)器不斷刷新,檢查?Cookies?的值是否發(fā)生變化,如果變化就進(jìn)行刷新的操作。

由于?Cookies?是在同域可讀的,所以在頁面 B 審核的時(shí)候改變?Cookies?的值,頁面 A 自然是可以拿到的。

這樣做確實(shí)可以實(shí)現(xiàn)我想要的功能,但是這樣的方法相當(dāng)浪費(fèi)資源。雖然在這個(gè)性能過盛的時(shí)代,浪費(fèi)不浪費(fèi)也感覺不出來,但是這種實(shí)現(xiàn)方案,確實(shí)不夠優(yōu)雅。

5、SharedWorker

HTML5 中的 Web Worker 可以分為兩種不同線程類型,一個(gè)是專用線程 Dedicated Worker,一個(gè)是共享線程 Shared Worker。

Dedicated Worker直接使用new Worker()即可創(chuàng)建,這種webworker是當(dāng)前頁面專有的。。

SharedWorker可以被多個(gè)window、標(biāo)簽頁、iframe共同使用,但必須保證這些標(biāo)簽頁都是同源的(相同的協(xié)議,主機(jī)和端口號)

6、直接引用

其實(shí)就是直接獲取對方DOM,適用于兩個(gè)頁面在同一域;可以傳遞對象數(shù)據(jù)(對象數(shù)據(jù)使用 instanceof 做類型判斷時(shí)有坑);參考 window.open;
例:

// 父頁面獲取子iframe
document.getElementById("iframe的id").contentWindow.document

// 子iframe獲取父頁面
window.parent.document
7、window.name

瀏覽器窗口有window.name屬性。這個(gè)屬性的最大特點(diǎn)是,無論是否同源,只要在同一個(gè)窗口里,前一個(gè)網(wǎng)頁設(shè)置了這個(gè)屬性,后一個(gè)網(wǎng)頁可以讀取它。

父窗口先打開一個(gè)子窗口,載入一個(gè)不同源的網(wǎng)頁,該網(wǎng)頁將信息寫入window.name屬性。

window.name = data;

接著,子窗口跳回一個(gè)與主窗口同域的網(wǎng)址。

window.location.;

然后,主窗口就可以讀取子窗口的window.name了。

var data = document.getElementById("iframe的id").contentWindow.name;

這種方法的優(yōu)點(diǎn)是,window.name容量很大,可以放置非常長的字符串;缺點(diǎn)是必須監(jiān)聽子窗口window.name屬性的變化,影響網(wǎng)頁性能。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99047.html

相關(guān)文章

  • 【Java】留下沒有基礎(chǔ)眼淚的面試題

    摘要:表示連接已經(jīng)成功建立。在這個(gè)狀態(tài)下,應(yīng)用程序還有接受數(shù)據(jù)的能力,但是已經(jīng)無法發(fā)送數(shù)據(jù)。表示收到了對方的報(bào)文,并發(fā)送出了報(bào)文。狀態(tài)下的連接會(huì)等待罕見的狀態(tài)。在窗口中還沒有發(fā)出的接收方還有空間。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。 前言 只有光頭才能變強(qiáng) 本文力求簡單講清每個(gè)知識點(diǎn),希望大家看完能有所收獲 一、如何減少線程上下文切換 使用多線程時(shí),不是多線程能提升程序的執(zhí)行速度,使用多線程...

    light 評論0 收藏0
  • 覽器父子窗口通信

    摘要:父子間窗口通信分兩種情況父子窗口同源瀏覽器的同源策略還沒了解到就請自行了。父窗口向子窗口通信子窗口是由父窗口創(chuàng)建的。父子窗口不同源這種情況下父子窗口要通信就需要借助的功能了。 父子窗口通信需求背景 最近在實(shí)現(xiàn)一個(gè)關(guān)聯(lián)谷歌賬戶的需求??吹骄W(wǎng)上的大部分涉及前端方面的實(shí)現(xiàn)都有這么個(gè)OAuth標(biāo)準(zhǔn)下的流程: 打開一個(gè)子窗口 在子窗口重定向到授權(quán)頁 用戶點(diǎn)擊授權(quán)按鈕 用戶授權(quán)后授權(quán)頁會(huì)重定向到...

    Miracle_lihb 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<