|
@@ -0,0 +1,316 @@
|
|
|
+<!DOCTYPE html>
|
|
|
+<html>
|
|
|
+
|
|
|
+<head>
|
|
|
+ <meta charset='UTF-8'>
|
|
|
+
|
|
|
+ <title>Websocket Meters</title>
|
|
|
+ <!--
|
|
|
+ Version 0.1 Contributed by William Greathouse 9-Sep-2013
|
|
|
+ Simple demo of WebSocket connection use. Not a great example of web coding,
|
|
|
+ but it is functional.
|
|
|
+
|
|
|
+ The meter displays are adapted from CSS-TRICKS Progress Bars by Chris Coyier
|
|
|
+ at http://css-tricks.com/css3-progress-bars/
|
|
|
+ -->
|
|
|
+ <style>
|
|
|
+ body {
|
|
|
+ background: #222;
|
|
|
+ }
|
|
|
+ h1 {
|
|
|
+ color: white;
|
|
|
+ text-align: center;
|
|
|
+ }
|
|
|
+ button {
|
|
|
+ width: 225px;
|
|
|
+ height: 30px;
|
|
|
+ margin: auto 10px;
|
|
|
+ background-color: #ccc;
|
|
|
+ -moz-border-radius: 5px;
|
|
|
+ -webkit-border-radius: 5px;
|
|
|
+ border-radius:6px;
|
|
|
+ color: blue;
|
|
|
+ font-size: 20px;
|
|
|
+ }
|
|
|
+ button:hover {
|
|
|
+ background-color: #888;
|
|
|
+ }
|
|
|
+ button:hover:disabled {
|
|
|
+ background-color: #ccc;
|
|
|
+ }
|
|
|
+ button:disabled {
|
|
|
+ color: lightgray;
|
|
|
+ }
|
|
|
+
|
|
|
+ .button_container {
|
|
|
+ width:550px;
|
|
|
+ display:block;
|
|
|
+ margin-left:auto;
|
|
|
+ margin-right:auto;
|
|
|
+ }
|
|
|
+
|
|
|
+ .meter {
|
|
|
+ height: 20px; /* Can be anything */
|
|
|
+ position: relative;
|
|
|
+ background: #555;
|
|
|
+ -moz-border-radius: 25px;
|
|
|
+ -webkit-border-radius: 25px;
|
|
|
+ border-radius: 25px;
|
|
|
+ padding: 10px;
|
|
|
+ -webkit-box-shadow: inset 0 -1px 1px rgba(255,255,255,0.3);
|
|
|
+ -moz-box-shadow : inset 0 -1px 1px rgba(255,255,255,0.3);
|
|
|
+ box-shadow : inset 0 -1px 1px rgba(255,255,255,0.3);
|
|
|
+ }
|
|
|
+ .meter > span {
|
|
|
+ display: block;
|
|
|
+ height: 100%;
|
|
|
+ -webkit-border-top-right-radius: 20px;
|
|
|
+ -webkit-border-bottom-right-radius: 20px;
|
|
|
+ -moz-border-radius-topright: 20px;
|
|
|
+ -moz-border-radius-bottomright: 20px;
|
|
|
+ border-top-right-radius: 20px;
|
|
|
+ border-bottom-right-radius: 20px;
|
|
|
+ -webkit-border-top-left-radius: 20px;
|
|
|
+ -webkit-border-bottom-left-radius: 20px;
|
|
|
+ -moz-border-radius-topleft: 20px;
|
|
|
+ -moz-border-radius-bottomleft: 20px;
|
|
|
+ border-top-left-radius: 20px;
|
|
|
+ border-bottom-left-radius: 20px;
|
|
|
+ background-color: rgb(43,194,83);
|
|
|
+ background-image: -webkit-gradient(
|
|
|
+ linear,
|
|
|
+ left bottom,
|
|
|
+ left top,
|
|
|
+ color-stop(0, rgb(43,194,83)),
|
|
|
+ color-stop(1, rgb(84,240,84))
|
|
|
+ );
|
|
|
+ background-image: -moz-linear-gradient(
|
|
|
+ center bottom,
|
|
|
+ rgb(43,194,83) 37%,
|
|
|
+ rgb(84,240,84) 69%
|
|
|
+ );
|
|
|
+ -webkit-box-shadow:
|
|
|
+ inset 0 2px 9px rgba(255,255,255,0.3),
|
|
|
+ inset 0 -2px 6px rgba(0,0,0,0.4);
|
|
|
+ -moz-box-shadow:
|
|
|
+ inset 0 2px 9px rgba(255,255,255,0.3),
|
|
|
+ inset 0 -2px 6px rgba(0,0,0,0.4);
|
|
|
+ box-shadow:
|
|
|
+ inset 0 2px 9px rgba(255,255,255,0.3),
|
|
|
+ inset 0 -2px 6px rgba(0,0,0,0.4);
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+ .meter > span:after, .animate > span > span {
|
|
|
+ content: "";
|
|
|
+ position: absolute;
|
|
|
+ top: 0; left: 0; bottom: 0; right: 0;
|
|
|
+ background-image:
|
|
|
+ -webkit-gradient(linear, 0 0, 100% 100%,
|
|
|
+ color-stop(.25, rgba(255, 255, 255, .2)),
|
|
|
+ color-stop(.25, transparent), color-stop(.5, transparent),
|
|
|
+ color-stop(.5, rgba(255, 255, 255, .2)),
|
|
|
+ color-stop(.75, rgba(255, 255, 255, .2)),
|
|
|
+ color-stop(.75, transparent), to(transparent)
|
|
|
+ );
|
|
|
+ background-image:
|
|
|
+ -moz-linear-gradient(
|
|
|
+ -45deg,
|
|
|
+ rgba(255, 255, 255, .2) 25%,
|
|
|
+ transparent 25%,
|
|
|
+ transparent 50%,
|
|
|
+ rgba(255, 255, 255, .2) 50%,
|
|
|
+ rgba(255, 255, 255, .2) 75%,
|
|
|
+ transparent 75%,
|
|
|
+ transparent
|
|
|
+ );
|
|
|
+ z-index: 1;
|
|
|
+ -webkit-background-size: 50px 50px;
|
|
|
+ -moz-background-size: 50px 50px;
|
|
|
+ -webkit-animation: move 2s linear infinite;
|
|
|
+ -webkit-border-top-right-radius: 20px;
|
|
|
+ -webkit-border-bottom-right-radius: 20px;
|
|
|
+ -moz-border-radius-topright: 20px;
|
|
|
+ -moz-border-radius-bottomright: 20px;
|
|
|
+ border-top-right-radius: 20px;
|
|
|
+ border-bottom-right-radius: 20px;
|
|
|
+ -webkit-border-top-left-radius: 20px;
|
|
|
+ -webkit-border-bottom-left-radius: 20px;
|
|
|
+ -moz-border-radius-topleft: 20px;
|
|
|
+ -moz-border-radius-bottomleft: 20px;
|
|
|
+ border-top-left-radius: 20px;
|
|
|
+ border-bottom-left-radius: 20px;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+
|
|
|
+ .animate > span:after {
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ @-webkit-keyframes move {
|
|
|
+ 0% {
|
|
|
+ background-position: 0 0;
|
|
|
+ }
|
|
|
+ 100% {
|
|
|
+ background-position: 50px 50px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .orange > span {
|
|
|
+ background-color: #f1a165;
|
|
|
+ background-image: -moz-linear-gradient(top, #f1a165, #f36d0a);
|
|
|
+ background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #f1a165),color-stop(1, #f36d0a));
|
|
|
+ background-image: -webkit-linear-gradient(#f1a165, #f36d0a);
|
|
|
+ }
|
|
|
+
|
|
|
+ .red > span {
|
|
|
+ background-color: #f0a3a3;
|
|
|
+ background-image: -moz-linear-gradient(top, #f0a3a3, #f42323);
|
|
|
+ background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #f0a3a3),color-stop(1, #f42323));
|
|
|
+ background-image: -webkit-linear-gradient(#f0a3a3, #f42323);
|
|
|
+ }
|
|
|
+
|
|
|
+ .nostripes > span > span, .nostripes > span:after {
|
|
|
+ -webkit-animation: none;
|
|
|
+ background-image: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ #output {
|
|
|
+ background-color: #ccc;
|
|
|
+ height: 240px;
|
|
|
+ overflow-y: auto;
|
|
|
+ }
|
|
|
+
|
|
|
+ </style>
|
|
|
+</head>
|
|
|
+
|
|
|
+<body>
|
|
|
+ <div id="page_wrap">
|
|
|
+
|
|
|
+ <h1>Meter Updates via WebSocket</h1>
|
|
|
+
|
|
|
+ <p/>
|
|
|
+
|
|
|
+ <div class="meter">
|
|
|
+ <span id="meter1" style="width: 25%"></span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <p/>
|
|
|
+
|
|
|
+ <div class="meter orange nostripes">
|
|
|
+ <span id="meter2" style="width: 33.3%"></span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <p/>
|
|
|
+
|
|
|
+ <div class="meter red">
|
|
|
+ <span id="meter3" style="width: 80%"></span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <p/>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ <div class="button_container">
|
|
|
+ <div>
|
|
|
+ <button id="connection" onclick="toggleConnection(this)">WebSocket Connect</button>
|
|
|
+ <button id="update" disabled onclick="toggleUpdate(this)">Disable Update</button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <p/>
|
|
|
+ <div id="output"></div>
|
|
|
+
|
|
|
+</body>
|
|
|
+
|
|
|
+<script language="javascript" type="text/javascript">
|
|
|
+ var connection; // websocket connection
|
|
|
+
|
|
|
+ function writeToScreen (message) {
|
|
|
+ var div = document.createElement('div');
|
|
|
+ var output = document.getElementById('output');
|
|
|
+ div.innerHTML = message;
|
|
|
+ output.appendChild(div);
|
|
|
+ output.scrollTop = output.scrollHeight;
|
|
|
+ }
|
|
|
+
|
|
|
+ function ws_connect() {
|
|
|
+ // check for websocket support
|
|
|
+ // for Internet Explorer < 10 there are options for websocket support that
|
|
|
+ // could be integrated into production code, but for now, we are expecting
|
|
|
+ // browser support to be present for this demo
|
|
|
+ if ('WebSocket' in window) {
|
|
|
+
|
|
|
+ writeToScreen('Connecting');
|
|
|
+ connection = new WebSocket('ws://' + window.location.host + '/meters');
|
|
|
+ connection.onopen = function(ev) {
|
|
|
+ document.getElementById("connection").innerHTML = "WebSocket Disconnect";
|
|
|
+ document.getElementById("update").disabled=false;
|
|
|
+ document.getElementById("update").innerHTML = "Disable Update";
|
|
|
+ writeToScreen('CONNECTED');
|
|
|
+ var message = 'update on';
|
|
|
+ writeToScreen('SENT: ' + message);
|
|
|
+ connection.send(message);
|
|
|
+ };
|
|
|
+
|
|
|
+ connection.onclose = function(ev) {
|
|
|
+ document.getElementById("update").disabled=true;
|
|
|
+ document.getElementById("update").innerHTML = "Enable Update";
|
|
|
+ document.getElementById("connection").innerHTML = "WebSocket Connect";
|
|
|
+ writeToScreen('DISCONNECTED');
|
|
|
+ };
|
|
|
+
|
|
|
+ connection.onmessage = function(ev) {
|
|
|
+ if (ev.data.substr(0,5) == "meter")
|
|
|
+ {
|
|
|
+ var target = ev.data.split(":")[0];
|
|
|
+ var meter = document.getElementById(target);
|
|
|
+ var data = ev.data.split(":")[1].split(",");
|
|
|
+ var percent = (data[0]*100)/data[1];
|
|
|
+ meter.style.width = percent+"%";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ writeToScreen('RECEIVED: ' + ev.data);
|
|
|
+ };
|
|
|
+
|
|
|
+ connection.onerror = function(ev) {
|
|
|
+ alert("WebSocket error");
|
|
|
+ };
|
|
|
+
|
|
|
+ } else {
|
|
|
+ alert("WebSocket is not available!!!\n" +
|
|
|
+ "Demo will not function.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // user connect/disconnect
|
|
|
+ function toggleConnection(el) {
|
|
|
+ var tag=el.innerHTML;
|
|
|
+ if (tag == "WebSocket Connect")
|
|
|
+ {
|
|
|
+ ws_connect();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ connection.close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // user turn updates on/off
|
|
|
+ function toggleUpdate(el) {
|
|
|
+ var tag=el.innerHTML;
|
|
|
+ var message;
|
|
|
+ if (tag == "Enable Update")
|
|
|
+ {
|
|
|
+ message = 'update on';
|
|
|
+ el.innerHTML = "Disable Update";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ message = 'update off';
|
|
|
+ el.innerHTML = "Enable Update";
|
|
|
+ }
|
|
|
+ writeToScreen('SENT: ' + message);
|
|
|
+ connection.send(message);
|
|
|
+ }
|
|
|
+</script>
|
|
|
+
|
|
|
+</html>
|