docs: Update online detection doc and fiddle (#29212)
* rework online detection doc and fiddle * add footnote * Update docs/tutorial/online-offline-events.md Co-authored-by: Erick Zhao <erick@hotmail.ca> * Update docs/tutorial/online-offline-events.md Co-authored-by: Erick Zhao <erick@hotmail.ca> * Update docs/tutorial/online-offline-events.md * Update docs/tutorial/online-offline-events.md * Update docs/tutorial/online-offline-events.md * chore: fix lint error Co-authored-by: Erick Zhao <erick@hotmail.ca> Co-authored-by: Cheng Zhao <github@zcbenz.com>
This commit is contained in:
parent
3ffaaf1872
commit
12aa6d7343
11 changed files with 98 additions and 171 deletions
13
docs/fiddles/features/online-detection/index.html
Normal file
13
docs/fiddles/features/online-detection/index.html
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Connection status: <strong id='status'></strong></h1>
|
||||||
|
|
||||||
|
<script src="renderer.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
26
docs/fiddles/features/online-detection/main.js
Normal file
26
docs/fiddles/features/online-detection/main.js
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
const { app, BrowserWindow } = require('electron')
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
const onlineStatusWindow = new BrowserWindow({
|
||||||
|
width: 300,
|
||||||
|
height: 200
|
||||||
|
})
|
||||||
|
|
||||||
|
onlineStatusWindow.loadFile('index.html')
|
||||||
|
}
|
||||||
|
|
||||||
|
app.whenReady().then(() => {
|
||||||
|
createWindow()
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
|
@ -1,17 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Hello World!</title>
|
|
||||||
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>Hello World!</h1>
|
|
||||||
<p>
|
|
||||||
We are using node <script>document.write(process.versions.node)</script>,
|
|
||||||
Chrome <script>document.write(process.versions.chrome)</script>,
|
|
||||||
and Electron <script>document.write(process.versions.electron)</script>.
|
|
||||||
</p>
|
|
||||||
<script src="renderer.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,24 +0,0 @@
|
||||||
const { app, BrowserWindow, ipcMain } = require('electron')
|
|
||||||
|
|
||||||
let onlineStatusWindow
|
|
||||||
|
|
||||||
app.whenReady().then(() => {
|
|
||||||
onlineStatusWindow = new BrowserWindow({ width: 0, height: 0, show: false, webPreferences: { nodeIntegration: true } })
|
|
||||||
onlineStatusWindow.loadURL(`file://${__dirname}/index.html`)
|
|
||||||
})
|
|
||||||
|
|
||||||
ipcMain.on('online-status-changed', (event, status) => {
|
|
||||||
console.log(status)
|
|
||||||
})
|
|
||||||
|
|
||||||
app.on('window-all-closed', () => {
|
|
||||||
if (process.platform !== 'darwin') {
|
|
||||||
app.quit()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
app.on('activate', () => {
|
|
||||||
if (BrowserWindow.getAllWindows().length === 0) {
|
|
||||||
createWindow()
|
|
||||||
}
|
|
||||||
})
|
|
|
@ -1,7 +0,0 @@
|
||||||
const { ipcRenderer } = require('electron')
|
|
||||||
const updateOnlineStatus = () => { ipcRenderer.send('online-status-changed', navigator.onLine ? 'online' : 'offline') }
|
|
||||||
|
|
||||||
window.addEventListener('online', updateOnlineStatus)
|
|
||||||
window.addEventListener('offline', updateOnlineStatus)
|
|
||||||
|
|
||||||
updateOnlineStatus()
|
|
8
docs/fiddles/features/online-detection/renderer.js
Normal file
8
docs/fiddles/features/online-detection/renderer.js
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
function onlineStatusIndicator () {
|
||||||
|
document.getElementById('status').innerHTML = navigator.onLine ? 'online' : 'offline'
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener('online', onlineStatusIndicator)
|
||||||
|
window.addEventListener('offline', onlineStatusIndicator)
|
||||||
|
|
||||||
|
onlineStatusIndicator()
|
|
@ -1,17 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Hello World!</title>
|
|
||||||
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>Hello World!</h1>
|
|
||||||
<p>
|
|
||||||
We are using node <script>document.write(process.versions.node)</script>,
|
|
||||||
Chrome <script>document.write(process.versions.chrome)</script>,
|
|
||||||
and Electron <script>document.write(process.versions.electron)</script>.
|
|
||||||
</p>
|
|
||||||
<script src="renderer.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,20 +0,0 @@
|
||||||
const { app, BrowserWindow } = require('electron')
|
|
||||||
|
|
||||||
let onlineStatusWindow
|
|
||||||
|
|
||||||
app.whenReady().then(() => {
|
|
||||||
onlineStatusWindow = new BrowserWindow({ width: 0, height: 0, show: false })
|
|
||||||
onlineStatusWindow.loadURL(`file://${__dirname}/index.html`)
|
|
||||||
})
|
|
||||||
|
|
||||||
app.on('window-all-closed', () => {
|
|
||||||
if (process.platform !== 'darwin') {
|
|
||||||
app.quit()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
app.on('activate', () => {
|
|
||||||
if (BrowserWindow.getAllWindows().length === 0) {
|
|
||||||
createWindow()
|
|
||||||
}
|
|
||||||
})
|
|
|
@ -1,6 +0,0 @@
|
||||||
const alertOnlineStatus = () => { window.alert(navigator.onLine ? 'online' : 'offline') }
|
|
||||||
|
|
||||||
window.addEventListener('online', alertOnlineStatus)
|
|
||||||
window.addEventListener('offline', alertOnlineStatus)
|
|
||||||
|
|
||||||
alertOnlineStatus()
|
|
BIN
docs/images/connection-status.png
Normal file
BIN
docs/images/connection-status.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
|
@ -21,83 +21,29 @@ status of Electron, you should develop additional means for this check.
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
### Event detection in the Renderer process
|
Starting with an HTML file `index.html`, this example will demonstrate how the `navigator.onLine` API can be used to build a connection status indicator.
|
||||||
|
|
||||||
Starting with a working application from the
|
```html title="index.html"
|
||||||
[Quick Start Guide](quick-start.md), update the `main.js` file
|
<!DOCTYPE html>
|
||||||
with the following lines:
|
<html>
|
||||||
|
<head>
|
||||||
```javascript
|
<meta charset="UTF-8">
|
||||||
const { app, BrowserWindow } = require('electron')
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
let onlineStatusWindow
|
</head>
|
||||||
|
<body>
|
||||||
app.whenReady().then(() => {
|
<h1>Connection status: <strong id='status'></strong></h1>
|
||||||
onlineStatusWindow = new BrowserWindow({ width: 0, height: 0, show: false })
|
<script src="renderer.js"></script>
|
||||||
onlineStatusWindow.loadURL(`file://${__dirname}/index.html`)
|
</body>
|
||||||
})
|
</html>
|
||||||
```
|
```
|
||||||
|
|
||||||
in the `index.html` file, add the following line before the
|
In order to mutate the DOM, create a `renderer.js` file that adds event listeners to the `'online'` and `'offline'` `window` events. The event handler sets the content of the `<strong id='status'>` element depending on the result of `navigator.onLine`.
|
||||||
closing `</body>` tag:
|
|
||||||
|
|
||||||
```html
|
```js title='renderer.js'
|
||||||
<script src="renderer.js"></script>
|
function updateOnlineStatus () {
|
||||||
```
|
document.getElementById('status').innerHTML = navigator.onLine ? 'online' : 'offline'
|
||||||
|
}
|
||||||
and add the `renderer.js` file:
|
|
||||||
|
|
||||||
```javascript fiddle='docs/fiddles/features/online-detection/renderer'
|
|
||||||
const alertOnlineStatus = () => { window.alert(navigator.onLine ? 'online' : 'offline') }
|
|
||||||
|
|
||||||
window.addEventListener('online', alertOnlineStatus)
|
|
||||||
window.addEventListener('offline', alertOnlineStatus)
|
|
||||||
|
|
||||||
alertOnlineStatus()
|
|
||||||
```
|
|
||||||
|
|
||||||
After launching the Electron application, you should see the notification:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### Event detection in the Main process
|
|
||||||
|
|
||||||
There may be situations when you want to respond to online/offline events in
|
|
||||||
the Main process as well. The Main process, however, does not have a
|
|
||||||
`navigator` object and cannot detect these events directly. In this case, you
|
|
||||||
need to forward the events to the Main process using Electron's inter-process
|
|
||||||
communication (IPC) utilities.
|
|
||||||
|
|
||||||
Starting with a working application from the
|
|
||||||
[Quick Start Guide](quick-start.md), update the `main.js` file
|
|
||||||
with the following lines:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
const { app, BrowserWindow, ipcMain } = require('electron')
|
|
||||||
let onlineStatusWindow
|
|
||||||
|
|
||||||
app.whenReady().then(() => {
|
|
||||||
onlineStatusWindow = new BrowserWindow({ width: 0, height: 0, show: false, webPreferences: { nodeIntegration: true } })
|
|
||||||
onlineStatusWindow.loadURL(`file://${__dirname}/index.html`)
|
|
||||||
})
|
|
||||||
|
|
||||||
ipcMain.on('online-status-changed', (event, status) => {
|
|
||||||
console.log(status)
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
in the `index.html` file, add the following line before the
|
|
||||||
closing `</body>` tag:
|
|
||||||
|
|
||||||
```html
|
|
||||||
<script src="renderer.js"></script>
|
|
||||||
```
|
|
||||||
|
|
||||||
and add the `renderer.js` file:
|
|
||||||
|
|
||||||
```javascript fiddle='docs/fiddles/features/online-detection/main'
|
|
||||||
const { ipcRenderer } = require('electron')
|
|
||||||
const updateOnlineStatus = () => { ipcRenderer.send('online-status-changed', navigator.onLine ? 'online' : 'offline') }
|
|
||||||
|
|
||||||
window.addEventListener('online', updateOnlineStatus)
|
window.addEventListener('online', updateOnlineStatus)
|
||||||
window.addEventListener('offline', updateOnlineStatus)
|
window.addEventListener('offline', updateOnlineStatus)
|
||||||
|
@ -105,14 +51,39 @@ window.addEventListener('offline', updateOnlineStatus)
|
||||||
updateOnlineStatus()
|
updateOnlineStatus()
|
||||||
```
|
```
|
||||||
|
|
||||||
After launching the Electron application, you should see the notification in the
|
Finally, create a `main.js` file for main process that creates the window.
|
||||||
Console:
|
|
||||||
|
|
||||||
```sh
|
```js title='main.js'
|
||||||
npm start
|
const { app, BrowserWindow } = require('electron')
|
||||||
|
|
||||||
> electron@1.0.0 start /electron
|
function createWindow () {
|
||||||
> electron .
|
const onlineStatusWindow = new BrowserWindow({
|
||||||
|
width: 400,
|
||||||
|
height: 100
|
||||||
|
})
|
||||||
|
|
||||||
online
|
onlineStatusWindow.loadFile('index.html')
|
||||||
|
}
|
||||||
|
|
||||||
|
app.whenReady().then(() => {
|
||||||
|
createWindow()
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
After launching the Electron application, you should see the notification:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> Note: If you need to communicate the connection status to the main process, use the [IPC renderer](../api/ipc-renderer.md) API.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue