In some of my applications I get ongoing data from websockets and I want some visual indication that the websocket is connected and receiving data, so I added an LED indicator much like a network router or switch would have.
Whereever I want the LED, I add div to show the LED.
<div class="led" id="ws-led"> <div class="led-red-off"> </div> </div>
then add some CSS rules to make it look like an LED indicator
div.led{ display : inline-block; vertical-align : bottom; } div.led-red-off, div.led-red-on, div.led-green-off, div.led-green-on { border : 0; border-radius : 50%; height : 1em; width : 1em; vertical-align : middle; background-repeat : no-repeat; display : inline-block; } div.led-red-on { background : #F44336; opacity: 1; } div.led-green-on { background : #4CAF50; opacity: 1; } div.led-red-off { background : #F44336; opacity: .5; } div.led-green-off { background : #4CAF50; opacity: .5; }and finally, some JS code to make them blink.
var wsLED = document.getElementById('ws-led'); // connected to the Websocket server (general) function connected(greeting) { // change the LED from initial red to green if (wsLED) wsLED.firstChild.setAttribute("class", "led-green-off"); } // connection to Websocket server lost function disconnected() { // if we loose the websocket connection, change the LED to red if (wsLED) wsLED.firstChild.setAttribute("class", "led-red-on"); } /** * logWSActivity * * log some WS activity */ function logWSActivity(...args) { console.log(...args); flashLED(wsLED); } /** * flashLEDs * * The visual effect of the flashing LEDs is done by switching the * CSS class for a 10th of a second per activity. If a new * activity happens within that time, the timeout to turn it back * off is reset to a new 10th of a second. */ var ledOffTimeout; function flashLED(led) { // flash activity LED if (led) { if (ledOffTimeout) { clearTimeout(ledOffTimeout); } led.firstChild.setAttribute("class", "led-green-on"); ledOffTimeout = setTimeout(function() { led.firstChild.setAttribute("class", "led-green-off"); }, 100); } }
No comments:
Post a Comment