<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no" /> <title>HTML5 Speedtest</title> <style type="text/css"> html,body{ border:none; padding:0; margin:0; background:#FFFFFF; color:#202020; } body{ text-align:center; font-family:"Roboto",sans-serif; } h1{ color:#404040; } #startStopBtn{ display:inline-block; margin:0 auto; color:#6060AA; background-color:rgba(0,0,0,0); border:0.15em solid #6060FF; border-radius:0.3em; transition:all 0.3s; box-sizing:border-box; width:8em; height:3em; line-height:2.7em; cursor:pointer; box-shadow: 0 0 0 rgba(0,0,0,0.1), inset 0 0 0 rgba(0,0,0,0.1); } #startStopBtn:hover{ box-shadow: 0 0 2em rgba(0,0,0,0.1), inset 0 0 1em rgba(0,0,0,0.1); } #startStopBtn.running{ background-color:#FF3030; border-color:#FF6060; color:#FFFFFF; } #startStopBtn:before{ content:"Start"; } #startStopBtn.running:before{ content:"Abort"; } #test{ margin-top:2em; margin-bottom:12em; } div.testArea{ display:inline-block; width:14em; height:9em; position:relative; box-sizing:border-box; } div.testName{ position:absolute; top:0.1em; left:0; width:100%; font-size:1.4em; z-index:9; } div.meterText{ position:absolute; bottom:1.5em; left:0; width:100%; font-size:2.5em; z-index:9; } #dlText{ color:#6060AA; } #ulText{ color:#309030; } #pingText,#jitText{ color:#AA6060; } div.meterText:empty:before{ color:#505050 !important; content:"0.00"; } div.unit{ position:absolute; bottom:2em; left:0; width:100%; z-index:9; } div.testGroup{ display:inline-block; } @media all and (max-width:65em){ body{ font-size:1.5vw; } } @media all and (max-width:40em){ body{ font-size:0.8em; } div.testGroup{ display:block; margin: 0 auto; } } </style> <script type="text/javascript"> function I(id){return document.getElementById(id);} var w=null; //speedtest worker function startStop(){ if(w!=null){ //speedtest is running, abort w.postMessage('abort'); w=null; I("startStopBtn").className=""; initUI(); }else{ //test is not running, begin w=new Worker('speedtest_worker.min.js'); w.postMessage('start'); //Add optional parameters as a JSON object to this command I("startStopBtn").className="running"; w.onmessage=function(e){ var data=e.data.split(';'); var status=Number(data[0]); if(status>=4){ //test completed I("startStopBtn").className=""; w=null; } I("ip").textContent=data[4]; I("dlText").textContent=(status==1&&data[1]==0)?"...":data[1]; I("ulText").textContent=(status==3&&data[2]==0)?"...":data[2]; I("pingText").textContent=data[3]; I("jitText").textContent=data[5]; }; } } //poll the status from the worker every 200ms (this will also update the UI) setInterval(function(){ if(w) w.postMessage('status'); },200); //function to (re)initialize UI function initUI(){ I("dlText").textContent=""; I("ulText").textContent=""; I("pingText").textContent=""; I("jitText").textContent=""; I("ip").textContent=""; } </script> </head> <body> <h1>HTML5 Speedtest</h1> <div id="startStopBtn" onclick="startStop()"></div> <div id="test"> <div class="testGroup"> <div class="testArea"> <div class="testName">Download</div> <div id="dlText" class="meterText"></div> <div class="unit">Mbps</div> </div> <div class="testArea"> <div class="testName">Upload</div> <div id="ulText" class="meterText"></div> <div class="unit">Mbps</div> </div> </div> <div class="testGroup"> <div class="testArea"> <div class="testName">Ping</div> <div id="pingText" class="meterText"></div> <div class="unit">ms</div> </div> <div class="testArea"> <div class="testName">Jitter</div> <div id="jitText" class="meterText"></div> <div class="unit">ms</div> </div> </div> <div id="ipArea"> IP Address: <span id="ip"></span> </div> </div> <a href="https://github.com/adolfintel/speedtest">Source code</a> <script type="text/javascript">initUI();</script> </body> </html>