HTML5中提供了在網頁文檔之間互相接收與發送信息的功能。使用這個功能只要獲取到網頁所在窗口對象的實例,不管是否同源均可以實現跨域通訊。常常用於不一樣frame之間的通訊。javascript
window.addEventListener("message", function () { ... }, false);
otherWindow.postMessage(message, targetOrigin) <!-- 該方法使用兩個參數:第一個參數爲所發送的消息文本 ,可是也能夠是任何javascript對象(經過JSON轉換爲 文本對象);第二個參數爲接受消息的對象窗口的URL地 址。能夠在URL地址字符串中使用通配符「*」指定所有地 址,otherWindow爲要發送窗口的對象引用,能夠用 window.open返回該對象,或者經過對window.frames數 組指定序號(index)或名字的方式來返回單個frame所 屬的窗口對象。 -->
window.addEventListener("message", function (e) { if (e.origin != "http://XXX") { return false; } alert(e.data); e.source.postMessage("您好,我已經收到",e.origin) })
通訊通道機制提供了一種在多個源之間通訊的方法,這些源之間經過端口(port)進行通訊,從一個端口中發出的數據將被另外一個端口接收。消息通道提供了一個直接,雙向瀏覽上下文之間的通訊手段。跟跨文檔通訊同樣,DOM不直接暴露。取而代之,管道每端爲端口,數據從一個端口發送,另外一個變成輸入(反之亦然)。java
當須要在iframe元素中的子頁面中實現通訊機制時,咱們要建立一個MessageChannel對象,咱們實際上創造了兩個相互關聯的端口。一個端口保持開放,爲發送端。另一個被轉發到其餘瀏覽上下文(另外一個iframe元素的子頁面中)。每個端口就是一個MessagePort對象,包含3個可用方法:web
webSockets 是HTML5提供的在web應用程序中客戶端與服務器端之間進行非HTTP請求的通訊機制。它實現了用HTTP不容易實現的服務端數據推送等智能通訊技術。瀏覽器經過 JavaScript向服務器發出創建WebSocket鏈接的請求,創建一個非HTTP的雙向連接,這個連接是實時的,也是永久的,除非被顯示關閉,鏈接創建之後,客戶端和服務器經過TCP鏈接直接交換數據。WebSocket鏈接本質上是一個TCP鏈接。另外,在WebSockets中一樣可使用跨域通訊技術。在使用跨域技術的時候應該確保客戶端與服務器是互相信任的。另外:WebSocket在數據傳輸的穩定性和數據傳輸量的大小方面,具備很大的性能優點。api
var webSockets = new WebSockets("ws://localhost:8005/socket"); <!-- url 字符串必須以"ws"或者"wss"(加密通訊)文字做爲開頭。這個url唄設定好以後,在javascript中能夠經過訪問webSockets對象的url屬性來獲取 -->
webSockets.send("data"); <!-- 這個方法只能發送文本數據,可是咱們能夠將任何類型的數據轉換爲JSON對象再進行發送 -->
// 經過獲取onmessage事件句柄來接收服務器傳過來的數據 webSocket.onmessage = function (e) { var data = event.data; } // 經過onopen事件句柄監聽socket打開事件 webSocket.onopen = function () { // 開始通訊時的處理 } // 經過onclose事件句柄來監聽socket的關閉事件 webSocket.onclose = function (event) { // 通訊結束時的處理 }
從字面意思來看,是隻由服務器發送一些事件,由客戶端接收。從「服務端主動發送」這一點上來看該API與WebSockets API有些類似之處,可是該API與WebSockets API不一樣的是,該API實現的是一種從服務器端發送到客戶端的單項通訊機制,而WebSockets API實現的是雙向通訊機制。在Sever-Sent Event API 中,服務端主動發送的事件有些相似於Javascript腳本代碼中的事件,可是不一樣的是,在客戶端不能控制服務端什麼時候發送這些事件,以及服務端在這些事件中攜帶哪些數據。跨域