å®å ¨ä¸ä¸æ: æ¤é¡¹åè½ä» å¨ä¸äºæ¯æçæµè§å¨çå®å ¨ä¸ä¸æï¼HTTPSï¼ä¸å¯ç¨ã
Notifications API å 许ç½é¡µæåºç¨ç¨åºä»¥ç³»ç»çº§å«åéå¨é¡µé¢å¤é¨æ¾ç¤ºçéç¥ï¼è¿æ ·å³ä½¿åºç¨ç¨åºç©ºé²æå¨åå°ï¼Web åºç¨ç¨åºä¹ä¼åç¨æ·åéä¿¡æ¯ãæ¬æå°ä»ç»å¨ä½ èªå·±çåºç¨ç¨åºä¸ä½¿ç¨æ¤ API çåºç¡ç¥è¯ã
é常ï¼ç³»ç»éç¥æ¯ææä½ç³»ç»çæ åéç¥æºå¶ï¼ä¾å¦ï¼æèå ¸åçæ¡é¢ç³»ç»æç§»å¨è®¾å¤å¦ä½åå¸éç¥ã
ç³»ç»éç¥ç³»ç»å½ç¶ä¼å å¹³å°åæµè§å¨èå¼ï¼ä½æ éæ å¿ï¼éç¥ API ç¼åå¾è¶³å¤éç¨ï¼è¶³ä»¥ä¸å¤§å¤æ°ç³»ç»éç¥ç³»ç»å ¼å®¹ã
夿³¨ï¼ æ¤ç¹æ§å¨ Web Worker ä¸å¯ç¨ã
示ä¾Web éç¥æææ¾çç¨ä¾ä¹ä¸æ¯åºäº Web çé®ä»¶æ IRC åºç¨ç¨åºï¼å³ä½¿ç¨æ·æ£å¨ä½¿ç¨å¦ä¸ä¸ªåºç¨ç¨åºæ§è¡å ¶ä»æä½ï¼å®ä¹éè¦å¨æ¶å°æ°æ¶æ¯æ¶éç¥ç¨æ·ãç°å¨åå¨è®¸å¤è¿æ ·çä¾åï¼ä¾å¦ Slackã
æä»¬ç¼åäºä¸ä¸ªç°å®ä¸çç示ä¾ââä¸ä¸ªå¾ åäºé¡¹å表åºç¨ç¨åºââæ¥è®©ä½ æ´å¤å°äºè§£å¦ä½ä½¿ç¨ Web éç¥ãå®ä½¿ç¨ IndexedDB 卿¬å°å卿°æ®ï¼å¹¶å¨ä»»å¡å°ææ¶ä½¿ç¨ç³»ç»éç¥éç¥ç¨æ·ãä¸è½½å¾ åäºé¡¹å表代ç ï¼ææ¥ç宿¶è¿è¡çåºç¨ç¨åºã
è¯·æ±æéå¨åºç¨ç¨åºå¯ä»¥åééç¥ä¹åï¼ç¨æ·å¿ é¡»æäºåºç¨ç¨åºè¿æ ·åçæå©ãå½ API å°è¯ä¸ç½é¡µä¹å¤çå 容è¿è¡äº¤äºæ¶ï¼è¿æ¯ä¸ä¸ªå¸¸è§çè¦æ±ââç¨æ·è³å°éè¦ä¸é¨æäºè¯¥åºç¨ç¨åºæ¾ç¤ºéç¥çæé䏿¬¡ï¼ä»èè®©ç¨æ·æ§å¶åªäºåºç¨ç¨åºæç«ç¹å 许æ¾ç¤ºéç¥ã
ç±äºè¿å»æ»¥ç¨æ¨ééç¥ï¼ç½ç»æµè§å¨åå¼å人åå·²å¼å§å®æ½çç¥æ¥å¸®å©ç¼è§£æ¤é®é¢ãä½ åºè¯¥ä» 请æ±åææ¾ç¤ºéç¥ä»¥ååºç¨æ·æå¿ï¼ä¾å¦ï¼å廿é®ï¼ãè¿ä¸ä» æ¯æä½³å®è·µï¼ä½ ä¸åºè¯¥åç¨æ·åéä»ä»¬ä¸åæçéç¥ï¼ï¼è䏿ªæ¥çæµè§å¨å°æç¡®ç¦æ¢æªååºç¨æ·æå¿è触åçéç¥æé请æ±ãä¾å¦ï¼Firefox ä»çæ¬ 72 å¼å§å°±å·²ç»è¿æ ·åäºï¼Safari ä¹å·²ç»è¿æ ·åäºä¸æ®µæ¶é´äºã
æ¤å¤ï¼å¨ Chrome å Firefox ä¸ï¼é¤éç½ç«æ¯å®å
¨ä¸ä¸æï¼å³ HTTPSï¼ï¼å¦åä½ æ ¹æ¬æ æ³è¯·æ±éç¥ï¼å¹¶ä¸ä½ ä¸è½åä»è·¨æº <iframe>
请æ±éç¥æéã
ä½ å¯ä»¥éè¿æ£æ¥åªè¯»å±æ§ Notification.permission
ç弿¥æ¥çä½ æ¯å¦å·²ç»ææéãè¯¥å±æ§çå¼å°ä¼æ¯ä¸åä¸ä¸ªä¹ä¸ï¼
default
ç¨æ·è¿æªè¢«è¯¢é®æ¯å¦ææï¼æä»¥éç¥ä¸ä¼è¢«æ¾ç¤ºã
granted
表示ä¹åå·²ç»è¯¢é®è¿ç¨æ·ï¼å¹¶ä¸ç¨æ·å·²ç»æäºäºæ¾ç¤ºéç¥çæéã
denied
ç¨æ·å·²ç»æç¡®å°æç»äºæ¾ç¤ºéç¥çæéã
妿尿ªæäºæ¾ç¤ºéç¥çæéï¼ååºç¨ç¨åºéè¦ä½¿ç¨ Notification.requestPermission()
æ¹æ³åç¨æ·è¯·æ±æ¤æéã卿ç®åçå½¢å¼ä¸ï¼æä»¬åªå
å«ä»¥ä¸å
容ï¼
Notification.requestPermission().then((result) => {
console.log(result);
});
è¿ä½¿ç¨äºè¯¥æ¹æ³çåºäº Promise ççæ¬ãå¦æä½ æ³æ¯ææ§çæ¬ï¼ä½ å¯è½å¿ é¡»ä½¿ç¨æ§çåè°çæ¬ï¼å¦ä¸æç¤ºï¼
Notification.requestPermission((result) => {
console.log(result);
});
åè°çæ¬å¯ä»¥éæ©æ¥åä¸ä¸ªåè°å½æ°ï¼ä¸æ¦ç¨æ·ååºäºæ¾ç¤ºæéç请æ±ï¼å°±ä¼è°ç¨è¯¥åè°å½æ°ã
夿³¨ï¼ ç®åæ æ³å¯é å°å¯¹ Notification.requestPermission
æ¯å¦æ¯æåºäº Promise ççæ¬è¿è¡ç¹æ§æµè¯ãå¦æä½ éè¦æ¯æè¾æ§çæµè§å¨ï¼åªé使ç¨åºäºåè°ççæ¬ââ尽管å®å·²è¢«å¼ç¨ï¼ä½å®ä»ç¶å¯ä»¥å¨æ°æµè§å¨ä¸ä½¿ç¨ãæå
³æ´å¤ä¿¡æ¯ï¼è¯·åé
æµè§å¨å
¼å®¹æ§è¡¨ã
卿们çå¾ åäºé¡¹å表æ¼ç¤ºä¸ï¼æä»¬å å«ä¸ä¸ªâå¯ç¨éç¥âæé®ï¼æä¸è¯¥æé®æ¶ï¼ä¼è¯·æ±åºç¨ç¨åºçéç¥æéã
<button id="enable">å¯ç¨éç¥</button>
å廿¤æé®å°è°ç¨ askNotificationPermission()
彿°ï¼
function askNotificationPermission() {
// æ£æ¥æµè§å¨æ¯å¦æ¯æéç¥
if (!("Notification" in window)) {
console.log("æ¤æµè§å¨ä¸æ¯æéç¥ã");
return;
}
Notification.requestPermission().then((permission) => {
// æ ¹æ®ç¨æ·çåçæ¾ç¤ºæéèæé®
notificationBtn.style.display = permission === "granted" ? "none" : "block";
});
}
é¦å
æ¥ç第äºä¸ªä¸»è¦åï¼ä½ ä¼åç°æä»¬é¦å
æ£æ¥æ¯å¦æ¯æéç¥ãå¦ææ¯æçè¯ï¼æä»¬æ¥çè¿è¡åºäº Promise ç Notification.requestPermission()
çæ¬ï¼å¦å卿§å¶å°è¾åºä¸æ¡æ¶æ¯ã
为äºé¿å
éå¤ä»£ç ï¼æä»¬å¨ handlePermission()
彿°ä¸åå¨äºä¸äºå
é¨ä»£ç ï¼è¿æ¯è¯¥ä»£ç 段ä¸ç第ä¸ä¸ªä¸»è¦åãå¨è¿éï¼æä»¬æç¡®è®¾ç½®äº Notification.permission
å¼ï¼æäºæ§çæ¬ç Chrome æ æ³èªå¨æ§è¡æ¤æä½ï¼ï¼å¹¶æ ¹æ®ç¨æ·å¨æéå¯¹è¯æ¡ä¸éæ©çå
容æ¾ç¤ºæéèæé®ãå¦æå·²ç»æäºè®¸å¯ï¼æä»¬ä¸æ³æ¾ç¤ºå®ï¼ä½å¦æç¨æ·éæ©æç»è®¸å¯ï¼æä»¬å¸æç»ä»ä»¬ç¨åæ¹å主æçæºä¼ã
å¨ä¼ éç» then
ç promise è§£æå¤çå¨ä¸ï¼æä»¬æ ¹æ®ç¨æ·å¨æéå¯¹è¯æ¡ä¸éæ©çå
容æ¾ç¤ºæéèæé®ãå¦æå·²ç»æäºè®¸å¯ï¼æä»¬ä¸æ³æ¾ç¤ºå®ï¼ä½å¦æç¨æ·éæ©æç»è®¸å¯ï¼æä»¬å¸æç»ä»ä»¬ç¨åæ¹å主æçæºä¼ã
å建éç¥å¾ç®åï¼åªéè¦ç¨ Notification
æé æ¹æ³ãè¿ä¸ªæé æ¹æ³éè¦ä¸ä¸ªç¨æ¥æ¾ç¤ºå¨éç¥å
çæ é¢ä»¥åä¸äºç¨æ¥å¢å¼ºéç¥çé项ï¼ä¾å¦ icon
æææ¬ body
ã
ä¾å¦ï¼å¨å¾
åäºé¡¹å表示ä¾ä¸ï¼æä»¬ä½¿ç¨ä»¥ä¸ä»£ç çæ®µå¨éè¦æ¶å建éç¥ï¼å¯ä»¥å¨ createNotification()
彿°ä¸æ¾å°ï¼ï¼
const img = "/to-do-notifications/img/icon-128.png";
const text = `å¿ï¼æ¨çä»»å¡â${title}âç°å·²è¿æã`;
const notification = new Notification("å¾
åå表", { body: text, icon: img });
å
³ééç¥
ä½¿ç¨ close()
å é¤ä¸åä¸ç¨æ·ç¸å
³çéç¥ï¼ä¾å¦ï¼å¯¹äºæ¶æ¯åºç¨ç¨åºï¼ç¨æ·å·²ç»é
读äºç½é¡µä¸çéç¥ï¼ ï¼æè
以䏿æ²å·²å¨é³ä¹åºç¨ç¨åºä¸ææ¾ä»¥éç¥ææ²æ´æ¹ï¼ã大夿°ç°ä»£æµè§å¨ä¼å¨ä¸æ®µæ¶é´ï¼å¤§çº¦åç§ï¼åèªå¨å
³ééç¥ï¼ä½è¿ä¸æ¯ä½ é常åºè¯¥å
³å¿çäºæ
ï¼å 为å®åå³äºç¨æ·åç¨æ·ä»£çãå é¤éç¥ä¹å¯è½åç卿ä½ç³»ç»çº§å«ï¼ç¨æ·åºè¯¥å¯¹æ¤ä¿ææ§å¶ãæ§çæ¬ç Chrome ä¸ä¼èªå¨å é¤éç¥ï¼å æ¤ä½ å¯ä»¥å¨ setTimeout()
ä¹åæ§è¡æ¤æä½ï¼ä»¥å
ä»å
¶ä»æµè§å¨çéç¥æçä¸å é¤éç¥ã
const n = new Notification("æçæ");
document.addEventListener("visibilitychange", () => {
if (document.visibilityState === "visible") {
// 该æ ç¾é¡µå·²å¯¹ç¨æ·å¯è§ï¼å æ¤å¯ä»¥æ¸
é¤ç°å·²è¿æ¶çéç¥ã
n.close();
}
});
夿³¨ï¼ æ¤ API ä¸åºä» ç¨äºå¨åºå®å»¶è¿åï¼å¨ç°ä»£æµè§å¨ä¸ï¼ä»å±å¹ä¸å é¤éç¥ï¼å ä¸ºæ¤æ¹æ³è¿ä¼ä»ä»»ä½éç¥æçä¸å é¤éç¥ï¼ä»è黿¢ç¨æ·å¨æåæ¾ç¤ºéç¥åä¸å ¶è¿è¡äº¤äºã
夿³¨ï¼ å½ä½ æ¶å°âå ³éâäºä»¶æ¶ï¼æ æ³ä¿è¯æ¯ç¨æ·å ³éäºéç¥ãè¿ç¬¦åè§èï¼å ¶ä¸è§å®ï¼å½åºå±éç¥å¹³å°æç¨æ·å ³ééç¥æ¶ï¼å¿ é¡»è¿è¡å ¶å ³éæ¥éª¤ã
éç¥äºä»¶Notification
å®ä¾ä¸ä¼è§¦åå个äºä»¶ï¼
click
å½ç¨æ·ç¹å»éç¥æ¶è§¦åã
close
å¨éç¥å ³éå触åã
error
妿éç¥åºç°é®é¢å触åï¼è¿é常æ¯å 为ç±äºæç§åå æ æ³æ¾ç¤ºéç¥ã
show
å½åç¨æ·æ¾ç¤ºéç¥æ¶è§¦åã
å¯ä»¥ä½¿ç¨ onclick
ãonclose
ãonerror
å onshow
å¤çå¨è·è¸ªè¿äºäºä»¶ãå 为 Notification
ä¹ç»§æ¿èª EventTarget
ï¼æä»¥å¯ä»¥ä½¿ç¨ addEventListener()
æ¹æ³ã
ç¨æ·é常ä¸å¸æå¨çæ¶é´å æ¶å°å¤§ééç¥ââä¾å¦ï¼å¦ææ¶æ¯åºç¨ç¨åºéç¥ç¨æ·æ¯æ¡ä¼ å ¥æ¶æ¯ï¼èè¿äºæ¶æ¯åééå¾å¤§ï¼è¯¥æä¹åï¼ä¸ºäºé¿å åç¨æ·åé太å¤éç¥ï¼å¯ä»¥ä¿®æ¹å¾ å¤çéç¥éåï¼ç¨æ°éç¥æ¿æ¢å个æå¤ä¸ªå¾ å¤çéç¥ã
为æ¤ï¼å¯ä»¥å任使°éç¥æ·»å æ ç¾ã妿éç¥å·²å ·æç¸åæ ç¾ä¸å°æªæ¾ç¤ºï¼åæ°éç¥å°æ¿æ¢å åçéç¥ã妿已æ¾ç¤ºå ·æç¸åæ ç¾çéç¥ï¼åå ³éä¸ä¸ä¸ªéç¥å¹¶æ¾ç¤ºæ°çéç¥ã
æ ç¾ç¤ºä¾å设æä»¥ä¸åºæ¬ HTMLï¼
<button id="notify">æéæï¼</button>
<section id="demo-logs"></section>
#demo-logs {
width: 90%;
height: 100px;
background-color: #ddd;
overflow-x: auto;
padding: 10px;
margin-top: 10px;
}
å¯ä»¥éè¿è¿ç§æ¹å¼å¤çå¤ä¸ªéç¥ï¼
const demoLogs = document.querySelector("#demo-logs");
window.addEventListener("load", () => {
const button = document.querySelector("#notify");
button.addEventListener("click", () => {
if (Notification?.permission === "granted") {
demoLogs.innerText += `该ç½ç«ææ¾ç¤ºéç¥çæéãæ£å¨æ¾ç¤ºéç¥ã\n`;
// å¦æç¨æ·åææ¥æ¶éç¥ï¼è®©æä»¬å°è¯åéå个éç¥
let i = 0;
// ä½¿ç¨æ¶é´é´é以é¿å
æäºæµè§å¨ï¼å
æ¬ Firefoxï¼å¨ç¹å®æ¶é´å
åºç°è¿å¤éç¥æ¶ä¼é»æ¢éç¥
const interval = setInterval(() => {
// ç±äº tag åæ°ï¼æä»¬åºè¯¥åªè½çå°âæ¥èª MDN ç第 9 ä¸ªä½ å¥½âéç¥
const n = new Notification(`æ¥èª MDN ç第 9 ä¸ªä½ å¥½ã`, {
tag: "soManyNotification",
});
if (i === 9) {
clearInterval(interval);
}
i++;
}, 200);
} else if (Notification?.permission !== "denied") {
demoLogs.innerText += "请æ±éç¥è®¸å¯ã\n";
// å¦æç¨æ·æ²¡æåè¯ä»ä»¬æ¯å¦æ³è¦æ¶å°éç¥ï¼æ³¨æï¼ç±äº Chromeï¼æä»¬ä¸ç¡®å®æ¯å¦è®¾ç½®äºæé屿§ï¼ï¼å æ¤æ£æ¥âé»è®¤â弿¯ä¸å®å
¨çã
Notification.requestPermission().then((status) => {
// å¦æç¨æ·åæ
if (status === "granted") {
demoLogs.innerText += "ç¨æ·æäºæéãæ£å¨åééç¥ã\n";
let i = 0;
// 使ç¨é´é以é¿å
æäºæµè§å¨ï¼å
æ¬ Firefoxï¼å¨ç¹å®æ¶é´å
åºç°è¿å¤éç¥æ¶ä¼é»æ¢éç¥
const interval = setInterval(() => {
// ç±äº tag åæ°ï¼æä»¬åºè¯¥åªè½çå°âæ¥èª MDN çæ¶æ¯ 9ãâéç¥
const n = new Notification(`æ¥èª MDN çæ¶æ¯ ${i}ã`, {
tag: "soManyNotification",
});
if (i === 9) {
clearInterval(interval);
}
i++;
}, 200);
} else {
// å¦åï¼æä»¬å¯ä»¥åéå°å¸¸è§æ¨¡å¼çæé
demoLogs.innerText += `ç¨æ·æç»äºæé请æ±ã\n`;
}
});
} else {
// å¦æç¨æ·æç»æ¶å°éç¥ï¼æä»¬å¯ä»¥åéå°å¸¸è§æ¨¡å¼çæé
demoLogs.innerText += `该ç«ç¹æ²¡ææ¾ç¤ºéç¥çæéã\n`;
}
});
});
ç»æ
ä¸ºäºæµè¯ä¸è¿°ç¤ºä¾ï¼è¯·æ´æ¹ https://live.mdnplay.dev
ç½ç«çåééç¥è®¾ç½®ã
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