example-singleServer-chart.html 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>HTML5 Speedtest</title>
  6. <style type="text/css">
  7. html,
  8. body {
  9. margin: 0;
  10. padding: 0;
  11. border: none;
  12. text-align: center;
  13. }
  14. #startBtn {
  15. display: inline-block;
  16. border: 0.15em solid #000000;
  17. padding: 0.3em 0.5em;
  18. margin: 0.6em;
  19. color: #000000;
  20. text-decoration: none;
  21. }
  22. #ip {
  23. margin: 0.8em 0;
  24. font-size: 1.2em;
  25. }
  26. #chart1Area,
  27. #chart2Area {
  28. width: 100%;
  29. max-width: 30em;
  30. height: 10em;
  31. display: block;
  32. margin: 0 auto;
  33. }
  34. </style>
  35. <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.bundle.min.js"></script> <!--THIS LIBRARY SUCKS!-->
  36. <script src="speedtest.js"></script>
  37. <script type="text/javascript">
  38. var s = null
  39. function runTest() {
  40. var chart1ctx = document.getElementById('chart1Area').getContext('2d')
  41. var chart2ctx = document.getElementById('chart2Area').getContext('2d')
  42. var dlDataset = {
  43. label: 'Download',
  44. fill: false,
  45. lineTension: 0.1,
  46. backgroundColor: 'rgba(75,192,192,0.4)',
  47. borderColor: 'rgba(75,192,192,1)',
  48. borderCapStyle: 'butt',
  49. borderDash: [],
  50. borderDashOffset: 0.0,
  51. borderJoinStyle: 'miter',
  52. pointBorderColor: 'rgba(75,192,192,1)',
  53. pointBackgroundColor: '#fff',
  54. pointBorderWidth: 1,
  55. pointHoverRadius: 5,
  56. pointHoverBackgroundColor: 'rgba(75,192,192,1)',
  57. pointHoverBorderColor: 'rgba(220,220,220,1)',
  58. pointHoverBorderWidth: 2,
  59. pointRadius: 1,
  60. pointHitRadius: 10,
  61. data: [0],
  62. spanGaps: false
  63. }
  64. var ulDataset = {
  65. label: 'Upload',
  66. fill: false,
  67. lineTension: 0.1,
  68. backgroundColor: 'rgba(192,192,75,0.4)',
  69. borderColor: 'rgba(192,192,75,1)',
  70. borderCapStyle: 'butt',
  71. borderDash: [],
  72. borderDashOffset: 0.0,
  73. borderJoinStyle: 'miter',
  74. pointBorderColor: 'rgba(192,192,75,1)',
  75. pointBackgroundColor: '#fff',
  76. pointBorderWidth: 1,
  77. pointHoverRadius: 5,
  78. pointHoverBackgroundColor: 'rgba(192,192,75,1)',
  79. pointHoverBorderColor: 'rgba(220,220,220,1)',
  80. pointHoverBorderWidth: 2,
  81. pointRadius: 1,
  82. pointHitRadius: 10,
  83. data: [0],
  84. spanGaps: false
  85. }
  86. var pingDataset = {
  87. label: 'Ping',
  88. fill: false,
  89. lineTension: 0.1,
  90. backgroundColor: 'rgba(75,220,75,0.4)',
  91. borderColor: 'rgba(75,220,75,1)',
  92. borderCapStyle: 'butt',
  93. borderDash: [],
  94. borderDashOffset: 0.0,
  95. borderJoinStyle: 'miter',
  96. pointBorderColor: 'rgba(75,220,75,1)',
  97. pointBackgroundColor: '#fff',
  98. pointBorderWidth: 1,
  99. pointHoverRadius: 5,
  100. pointHoverBackgroundColor: 'rgba(75,220,75,1)',
  101. pointHoverBorderColor: 'rgba(220,220,220,1)',
  102. pointHoverBorderWidth: 2,
  103. pointRadius: 1,
  104. pointHitRadius: 10,
  105. data: [],
  106. spanGaps: false
  107. }
  108. var jitterDataset = {
  109. label: 'Jitter',
  110. fill: false,
  111. lineTension: 0.1,
  112. backgroundColor: 'rgba(220,75,75,0.4)',
  113. borderColor: 'rgba(220,75,75,1)',
  114. borderCapStyle: 'butt',
  115. borderDash: [],
  116. borderDashOffset: 0.0,
  117. borderJoinStyle: 'miter',
  118. pointBorderColor: 'rgba(220,75,75,1)',
  119. pointBackgroundColor: '#fff',
  120. pointBorderWidth: 1,
  121. pointHoverRadius: 5,
  122. pointHoverBackgroundColor: 'rgba(220,75,75,1)',
  123. pointHoverBorderColor: 'rgba(220,220,220,1)',
  124. pointHoverBorderWidth: 2,
  125. pointRadius: 1,
  126. pointHitRadius: 10,
  127. data: [],
  128. spanGaps: false
  129. }
  130. var chart1Options = {
  131. type: 'line',
  132. data: {
  133. datasets: [dlDataset, ulDataset]
  134. },
  135. options: {
  136. responsive: true,
  137. legend: {
  138. position: 'bottom'
  139. },
  140. scales: {
  141. xAxes: [{
  142. display: true,
  143. scaleLabel: {
  144. display: false
  145. },
  146. ticks: {
  147. beginAtZero: true
  148. }
  149. }],
  150. yAxes: [{
  151. display: true,
  152. scaleLabel: 'Speed',
  153. ticks: {
  154. beginAtZero: true
  155. }
  156. }]
  157. }
  158. }
  159. }
  160. var chart2Options = {
  161. type: 'line',
  162. data: {
  163. datasets: [pingDataset, jitterDataset]
  164. },
  165. options: {
  166. responsive: true,
  167. legend: {
  168. position: 'bottom'
  169. },
  170. scales: {
  171. xAxes: [{
  172. display: true,
  173. scaleLabel: {
  174. display: false
  175. },
  176. ticks: {
  177. beginAtZero: true
  178. }
  179. }],
  180. yAxes: [{
  181. display: true,
  182. scaleLabel: 'Latency',
  183. ticks: {
  184. beginAtZero: true
  185. }
  186. }]
  187. }
  188. }
  189. }
  190. var chart1 = new Chart(chart1ctx, chart1Options)
  191. var chart2 = new Chart(chart2ctx, chart2Options)
  192. document.getElementById('startBtn').style.display = 'none'
  193. document.getElementById('testArea').style.display = ''
  194. document.getElementById('abortBtn').style.display = ''
  195. s=new Speedtest();
  196. s.onupdate = function (data) {
  197. var status = data.testState
  198. if (status === 1 && Number(data.dlStatus) > 0) {
  199. for(var i=~~(20*Number(data.dlProgress));i<20;i++) chart1.data.datasets[0].data[i]=(Number(data.dlStatus))
  200. chart1.data.labels[chart1.data.datasets[0].data.length - 1] = ''
  201. chart1.update()
  202. }
  203. if (status === 3 && Number(data.ulStatus) > 0) {
  204. for(var i=~~(20*Number(data.ulProgress));i<20;i++) chart1.data.datasets[1].data[i]=(Number(data.ulStatus))
  205. chart1.data.labels[chart1.data.datasets[1].data.length - 1] = ''
  206. chart1.update()
  207. }
  208. if (status === 2 && Number(data.pingStatus) > 0) {
  209. chart2.data.datasets[0].data.push(Number(data.pingStatus))
  210. chart2.data.datasets[1].data.push(Number(data.jitterStatus))
  211. chart2.data.labels[chart2.data.datasets[0].data.length - 1] = ''
  212. chart2.data.labels[chart2.data.datasets[1].data.length - 1] = ''
  213. chart2.update()
  214. }
  215. ip.textContent = data.clientIp
  216. }
  217. s.onend=function(aborted){
  218. document.getElementById('abortBtn').style.display = 'none'
  219. document.getElementById('startBtn').style.display = ''
  220. s = null
  221. if (aborted) {
  222. document.getElementById('testArea').style.display = 'none'
  223. }
  224. }
  225. s.start();
  226. }
  227. function abortTest() {
  228. if (s) s.abort();
  229. }
  230. </script>
  231. </head>
  232. <body>
  233. <h1>HTML Speedtest - Chart.js example</h1>
  234. <div id="testArea" style="display:none">
  235. <p id="ip">Please wait...</p>
  236. <h2>Speed</h2>
  237. <canvas id="chart1Area"></canvas>
  238. <h2>Latency</h2>
  239. <canvas id="chart2Area"></canvas>
  240. <br/>
  241. <a href="javascript:abortTest()" id="abortBtn">Abort</a>
  242. </div>
  243. <a href="javascript:runTest()" id="startBtn">Run speedtest</a>
  244. <br/><br/> Charts by <a href="http://www.chartjs.org/">Chart.js</a><br/><br/><a href="https://github.com/adolfintel/speedtest">Source code</a>
  245. </body>
  246. </html>