
- HTML 教程
- HTML - 首頁
- HTML - 路線圖
- HTML - 簡介
- HTML - 歷史與演變
- HTML - 編輯器
- HTML - 基本標籤
- HTML - 元素
- HTML - 屬性
- HTML - 標題
- HTML - 段落
- HTML - 字型
- HTML - 塊
- HTML - 樣式表
- HTML - 格式化
- HTML - 引用
- HTML - 註釋
- HTML - 顏色
- HTML - 圖片
- HTML - 圖片地圖
- HTML - 內聯框架
- HTML - 短語元素
- HTML - 元標籤
- HTML - 類
- HTML - ID
- HTML - 背景
- HTML 表格
- HTML - 表格
- HTML - 表頭與標題
- HTML - 表格樣式
- HTML - 表格 Colgroup
- HTML - 巢狀表格
- HTML 列表
- HTML - 列表
- HTML - 無序列表
- HTML - 有序列表
- HTML - 定義列表
- HTML 連結
- HTML - 文字連結
- HTML - 圖片連結
- HTML - 郵件連結
- HTML 顏色名稱與值
- HTML - 顏色名稱
- HTML - RGB
- HTML - HEX
- HTML - HSL
- HTML 表單
- HTML - 表單
- HTML - 表單屬性
- HTML - 表單控制元件
- HTML - 輸入屬性
- HTML 媒體
- HTML - 影片元素
- HTML - 音訊元素
- HTML - 嵌入多媒體
- HTML 頭部
- HTML - 頭元素
- HTML - 新增 Favicon
- HTML - Javascript
- HTML 佈局
- HTML - 佈局
- HTML - 佈局元素
- HTML - 使用 CSS 進行佈局
- HTML - 響應式設計
- HTML - 符號
- HTML - 表情符號
- HTML - 樣式指南
- HTML 圖形
- HTML - SVG
- HTML - Canvas
- HTML API
- HTML - Geolocation API
- HTML - 拖放 API
- HTML - Web Workers API
- HTML - WebSocket
- HTML - Web 儲存
- HTML - 伺服器傳送事件
- HTML 雜項
- HTML - 文件物件模型 (DOM)
- HTML - MathML
- HTML - 微資料
- HTML - IndexedDB
- HTML - 網頁訊息傳遞
- HTML - Web CORS
- HTML - Web RTC
- HTML 演示
- HTML - 音訊播放器
- HTML - 影片播放器
- HTML - 網頁幻燈片
- HTML 工具
- HTML - Velocity Draw
- HTML - 二維碼
- HTML - Modernizer
- HTML - 驗證
- HTML - 顏色拾取器
- HTML 參考
- HTML - 速查表
- HTML - 標籤參考
- HTML - 屬性參考
- HTML - 事件參考
- HTML - 字型參考
- HTML - ASCII 碼
- ASCII 碼錶查詢
- HTML - 顏色名稱
- HTML - 實體
- MIME 媒體型別
- HTML - URL 編碼
- 語言 ISO 程式碼
- HTML - 字元編碼
- HTML - 已棄用標籤
- HTML 資源
- HTML - 快速指南
- HTML - 有用資源
- HTML - 顏色程式碼生成器
- HTML - 線上編輯器
HTML - 網頁訊息傳遞
網頁訊息傳遞是文件分離瀏覽上下文以共享資料而無需 DOM 的方式。它克服了不同域、協議或埠之間跨域通訊的問題。
例如,如果我們想將資料從我們的頁面傳送到放置在 iframe 中的廣告容器或反之亦然,在這種情況下,瀏覽器會丟擲一個安全異常。使用網頁訊息傳遞,我們可以將資料作為訊息事件傳遞。
訊息事件
訊息事件觸發跨文件訊息傳遞、通道訊息傳遞、伺服器傳送事件和 Web 套接字。它由訊息事件介面描述。
訊息事件的屬性
下表包含訊息事件屬性列表:
序號 | 屬性及描述 |
---|---|
1 | data 包含字串資料 |
2 | origin 包含域名和埠 |
3 | lastEventId 包含當前訊息事件的唯一識別符號。 |
4 | source 包含對源文件視窗的引用 |
5 | ports 包含由任何訊息埠傳送的資料 |
傳送跨文件訊息
在傳送跨文件訊息之前,我們需要透過建立新的 iframe 或新視窗來建立一個新的 Web 瀏覽上下文。我們可以使用 postMessage() 傳送資料,它有兩個引數。它們是:
message - 要傳送的訊息
targetOrigin - 源名稱
示例
從 iframe 傳送訊息到按鈕
var iframe = document.querySelector('iframe'); var button = document.querySelector('button'); var clickHandler = function(){ iframe.contentWindow.postMessage('The message to send.','https://tutorialspoint.tw); } button.addEventListener('click',clickHandler,false);
在接收文件中接收跨文件訊息
var messageEventHandler = function(event){ // check that the origin is one we want. if(event.origin == 'https://tutorialspoint.tw'){ alert(event.data); } } window.addEventListener('message', messageEventHandler,false);
通道訊息傳遞
瀏覽上下文之間的雙向通訊稱為通道訊息傳遞。它對於跨多個源的通訊很有用。
MessageChannel 和 MessagePort 物件
在建立 messageChannel 時,它會在內部建立兩個埠來發送資料並轉發到另一個瀏覽上下文。
postMessage() - 透過通道釋出訊息
start() - 它傳送資料
close() - 它關閉埠
在這種情況下,我們正在將資料從一個 iframe 傳送到另一個 iframe。在這裡,我們正在函式中呼叫資料並將資料傳遞給 DOM。
var loadHandler = function(){ var mc, portMessageHandler; mc = new MessageChannel(); window.parent.postMessage('documentAHasLoaded','http://foo.example',[mc.port2]); portMessageHandler = function(portMsgEvent){ alert( portMsgEvent.data ); } mc.port1.addEventListener('message', portMessageHandler, false); mc.port1.start(); } window.addEventListener('DOMContentLoaded', loadHandler, false);
上面的程式碼從埠 2 獲取資料,現在它將資料傳遞到第二個 iframe。
var loadHandler = function(){ var iframes, messageHandler; iframes = window.frames; messageHandler = function(messageEvent){ if( messageEvent.ports.length > 0 ){ // transfer the port to iframe[1] iframes[1].postMessage('portopen','http://foo.example',messageEvent.ports); } } window.addEventListener('message',messageHandler,false); } window.addEventListener('DOMContentLoaded',loadHandler,false);
現在第二個文件使用 portMsgHandler 函式處理資料。
var loadHandler(){ // Define our message handler function var messageHandler = function(messageEvent){ // Our form submission handler var formHandler = function(){ var msg = 'add <foo@example.com> to game circle.'; messageEvent.ports[0].postMessage(msg); } document.forms[0].addEventListener('submit',formHandler,false); } window.addEventListener('message',messageHandler,false); } window.addEventListener('DOMContentLoaded',loadHandler,false);
廣告