夿³¨ï¼ æ¤ç¹æ§å¨ Web Worker ä¸å¯ç¨ã
Channel Messaging API å¯ä»¥è®©ä¸¤ä¸ªå¨éå å°åä¸ææ¡£çä¸åæµè§ä¸ä¸æä¸è¿è¡çåç¬èæ¬ï¼æ¯å¦ï¼ä¸¤ä¸ª <iframe>
å
ç´ ï¼æè
ä¸»ææ¡£åä¸ä¸ª <iframe>
ï¼æè
使ç¨åä¸ä¸ª SharedWorker
çä¸¤ä¸ªææ¡£ï¼ç´æ¥éä¿¡ï¼éè¿ä¸¤ç«¯é½æç«¯å£çååé¢éï¼æç®¡éï¼ç¸äºä¼ éæ¶æ¯ã
卿¬æä¸ï¼æä»¬å°æ¢ç´¢è¿é¡¹ææ¯çåºæ¬ç¨æ³ã
ç¨ä¾é¢éæ¶æ¯ä¼ éå¨è¿æ ·çåºæ¯ä¸ç¹å«æç¨ï¼åå¦ä½ æä¸ä¸ªç¤¾äº¤ç«ç¹ï¼å®å¨ä¸»çé¢ä¸éè¿ iframe å
åµäºæ¥èªå
¶ä»ç«ç¹çå
å®¹ï¼æ¯å¦æ¸¸æï¼éè®¯å½æè
ä¸ä¸ªé³ä¹ææ¾å¨ï¼æç个æ§åçé³ä¹éæ©ãå½è¿äºå
容ä½ä¸ºç¬ç«çåå
æ¶ï¼ä¸å齿¯ OK çï¼ä½æ¯å½ä½ æ³å¨ä¸»ç«ç¹å <iframe>
ï¼æè
å¨ä¸åç <iframe>
é´äº¤äºæ¶ï¼å°é¾å°±åºç°äºã䏾便¥è¯´ï¼åå¦ä½ æ³ä»ä¸»ç«ç¹åé讯å½éæ·»å ä¸ä¸ªèç³»äººï¼æè
æ³ä»æ¸¸æéï¼ææé«åå å
¥å°ä¸ªäººèµæï¼åæè
ï¼å¸æä»é³é¢ææ¾å¨éï¼æ·»å æ°çèæ¯é³ä¹å°æ¸¸æä¸ï¼å 为æµè§å¨ä½¿ç¨çå®å
¨æ¨¡åï¼ä½¿ç¨ä¼ ç»ç Web ææ¯æ¥åè¿äºäºå¹¶ä¸å®¹æãä½ å¿
é¡»å»èèä¸åçæºä¹é´å½¼æ¤æ¯å¦ä¿¡ä»»ï¼ä»¥åå¦ä½ä¼ éæ¶æ¯ã
æ¢ä¸ªè§åº¦è¯´ï¼æ¶æ¯é¢éå¯ä»¥æä¾ä¸ä¸ªè®©ä½ å¨ä¸åçæµè§ä¸ä¸æé´ä¼ éæ°æ®çå®å ¨é¢éã
夿³¨ï¼ è¦äºè§£æ´å¤ä¿¡æ¯åæ³æ³ï¼è§èç端å£ä½ä¸º Web ä¸ä¸ä¸ªå¯¹è±¡å ¼å®¹æ¨¡åçåºç¡ç« èå¼å¾ä¸è¯»ã
ç®åç示ä¾ä¸ºäºå¸®å©ä½ å¼å§ï¼æä»¬å¨ Github ä¸åå¸äºä¸äºæ¼ç¤ºãä¸å¼å§å¯ä»¥å
çæä»¬çæ¶æ¯ä¼ éåºæ¬ç¤ºä¾ï¼ä¹å¯ä»¥å¨çº¿è¿è¡ï¼ï¼å®å±ç¤ºäºä¸ä¸ªé常ç®åçæ¶æ¯ä¼ éï¼åçå¨é¡µé¢åå
åµ <iframe>
ä¹é´ã
ç¶åï¼ççæä»¬ç夿¡æ¶æ¯ä¼ éæ¼ç¤ºï¼å¨çº¿è¿è¡ï¼ï¼å®å±ç¤ºäºä¸ä¸ªç¨å¾®å¤æä¸ç¹çä¾åï¼å¯ä»¥å¨ä¸»é¡µé¢å IFrame ä¹é´åé夿¡æ¶æ¯ã
æ¬æä¸ï¼æä»¬éç¹è¯´åé¢çè¿ä¸ªä¾åãå®çèµ·æ¥åæ¯è¿æ ·ï¼
å建é¢éå¨ä¾åç主页é¢ï¼æä»¬æä¸ä¸ªç®åç表åï¼å
å«ä¸ä¸ªææ¬è¾å
¥æ¡ï¼ç¨æ¥è¾å
¥è¦åéå° <iframe>
çæ¶æ¯ãæä»¬è¿æä¸ä¸ªæ®µè½ï¼æä»¬å¨ç¨åå°ä¼ç¨å®æ¥æ¾ç¤º <iframe>
åä¼ åæ¥çç¡®è®¤æ¶æ¯ã
const input = document.getElementById("message-input");
const output = document.getElementById("message-output");
const button = document.querySelector("button");
const iframe = document.querySelector("iframe");
const channel = new MessageChannel();
const port1 = channel.port1;
// çå¾
iframe å è½½
iframe.addEventListener("load", onLoad);
function onLoad() {
// ç嬿é®ç¹å»
button.addEventListener("click", onClick);
// å¨ port1 ç嬿¶æ¯
port1.onmessage = onMessage;
// æ port2 ä¼ ç» iframe
iframe.contentWindow.postMessage("init", "*", [channel.port2]);
}
// 彿é®ç¹å»æ¶ï¼å¨ port1 ä¸åéä¸ä¸ªæ¶æ¯
function onClick(e) {
e.preventDefault();
port1.postMessage(input.value);
}
// å¤ç port1 æ¶å°çæ¶æ¯
function onMessage(e) {
output.innerHTML = e.data;
input.value = "";
}
æä»¬ä»ä½¿ç¨ MessageChannel()
æé 彿°å建äºä¸ä¸ªæ¶æ¯é¢éå¼å§ã
å½ IFrame å è½½å®æï¼æä»¬å¨æé®ä¸æ³¨åäº onclick
äºä»¶å¤çå¨ï¼å¨ MessageChannel.port1
注åäº onmessage
äºä»¶å¤çå¨ãæåï¼æä»¬ä½¿ç¨ window.postMessage
æ¹æ³æ MessageChannel.port2
ä¼ éç» IFrameã
让æä»¬æ´è¯¦ç»å°äºè§£ä¸ä¸ iframe.contentWindow.postMessage
è¡çå·¥ä½åçã宿¥åä¸ä¸ªåæ°ï¼
'init'
ã*
æææ¯â任使ºâãMessageChannel.port2
ä¼ ç»äº IFrameï¼ç¶åå®å°±å¯ä»¥ç¨äºä¸ä¸»é¡µé¢éä¿¡äºã彿们çæé®è¢«ç¹å»æ¶ï¼æä»¬é»æ¢äºé»è®¤ç表åæäº¤ï¼ç¶åæè¾å
¥å°è¾å
¥æ¡éçå
容éè¿ MessageChannel
åéç» IFrameã
å¨ IFrame éï¼æä»¬æä¸é¢ç JavaScriptï¼
const list = document.querySelector("ul");
let port2;
// çå¬åå§ç端å£ä¼ éæ¶æ¯
window.addEventListener("message", initPort);
// è®¾ç½®ä¼ éè¿æ¥ç端å£
function initPort(e) {
port2 = e.ports[0];
port2.onmessage = onMessage;
}
// å¤ç port2 æ¶å°çæ¶æ¯
function onMessage(e) {
const listItem = document.createElement("li");
listItem.textContent = e.data;
list.appendChild(listItem);
port2.postMessage(`IFrame æ¶å°çæ¶æ¯ï¼â${e.data}â`);
}
彿¶å°ä»ä¸»é¡µé¢éè¿ window.postMessage
æ¹æ³ä¼ æ¥çåå§åæ¶æ¯æ¶ï¼æä»¬è¿è¡ initPort
彿°ãå®ä¼ä¿åä¼ éè¿æ¥ç端å£ï¼å¹¶ä¸æ³¨åäºä¸ä¸ª onmessage äºä»¶å¤çå¨ï¼æ¯å½ææ¶æ¯éè¿æä»¬ç MessageChannel
ä¼ æ¥æ¶ï¼å®é½ä¼è¢«è°ç¨ã
彿¶å°ä»ä¸»é¡µé¢åæ¥çæ¶æ¯æ¶ï¼æä»¬å建ä¸ä¸ªå表项ï¼å¹¶æå®æå
¥å°è¿ä¸ªæ åºå表ä¸ï¼ç¶åæè¿ä¸ªå表项ç textContent
设置为äºä»¶ç data
屿§ï¼éé¢å
å«çæ£çæ¶æ¯ï¼ã
æ¥ä¸æ¥ï¼æä»¬éè¿å¨åå§åæ¶ä¼ éå° IFrame ç MessageChannel.port2
ä¸è°ç¨ MessagePort.postMessage
æ¥ä½¿ç¨æ¶æ¯é¢éå°ç¡®è®¤æ¶æ¯åéå主页é¢ã
åå°ä¸»é¡µé¢ï¼æä»¬æ¥ä¸èµ·çç onmessage
äºä»¶å¤çå¨ã
// å¤ç port1 䏿¶å°çæ¶æ¯
function onMessage(e) {
output.innerHTML = e.data;
input.value = "";
}
彿¶å°ä» IFrame 忥çç¡®è®¤æ¶æ¯ï¼è¯´æåå§æ¶æ¯è¢«æåæ¥æ¶æ¶ï¼å®æç¡®è®¤æ¶æ¯è¾åºå°æ®µè½ä¸ï¼å¹¶æ¸ 空è¾å ¥æ¡ï¼ä¸ºè¾å ¥ä¸ä¸ä¸ªè¦è¢«åéçæ¶æ¯ååå¤ã
è§è æµè§å¨å ¼å®¹æ§ api.MessageChannel api.MessagePort åè§RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4