example-chart.html 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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>
  36. <script type="text/javascript">
  37. var w = null
  38. function runTest() {
  39. var chart1ctx = document.getElementById('chart1Area').getContext('2d')
  40. var chart2ctx = document.getElementById('chart2Area').getContext('2d')
  41. var dlDataset = {
  42. label: 'Download',
  43. fill: false,
  44. lineTension: 0.1,
  45. backgroundColor: 'rgba(75,192,192,0.4)',
  46. borderColor: 'rgba(75,192,192,1)',
  47. borderCapStyle: 'butt',
  48. borderDash: [],
  49. borderDashOffset: 0.0,
  50. borderJoinStyle: 'miter',
  51. pointBorderColor: 'rgba(75,192,192,1)',
  52. pointBackgroundColor: '#fff',
  53. pointBorderWidth: 1,
  54. pointHoverRadius: 5,
  55. pointHoverBackgroundColor: 'rgba(75,192,192,1)',
  56. pointHoverBorderColor: 'rgba(220,220,220,1)',
  57. pointHoverBorderWidth: 2,
  58. pointRadius: 1,
  59. pointHitRadius: 10,
  60. data: [0],
  61. spanGaps: false
  62. }
  63. var ulDataset = {
  64. label: 'Upload',
  65. fill: false,
  66. lineTension: 0.1,
  67. backgroundColor: 'rgba(192,192,75,0.4)',
  68. borderColor: 'rgba(192,192,75,1)',
  69. borderCapStyle: 'butt',
  70. borderDash: [],
  71. borderDashOffset: 0.0,
  72. borderJoinStyle: 'miter',
  73. pointBorderColor: 'rgba(192,192,75,1)',
  74. pointBackgroundColor: '#fff',
  75. pointBorderWidth: 1,
  76. pointHoverRadius: 5,
  77. pointHoverBackgroundColor: 'rgba(192,192,75,1)',
  78. pointHoverBorderColor: 'rgba(220,220,220,1)',
  79. pointHoverBorderWidth: 2,
  80. pointRadius: 1,
  81. pointHitRadius: 10,
  82. data: [0],
  83. spanGaps: false
  84. }
  85. var pingDataset = {
  86. label: 'Ping',
  87. fill: false,
  88. lineTension: 0.1,
  89. backgroundColor: 'rgba(75,220,75,0.4)',
  90. borderColor: 'rgba(75,220,75,1)',
  91. borderCapStyle: 'butt',
  92. borderDash: [],
  93. borderDashOffset: 0.0,
  94. borderJoinStyle: 'miter',
  95. pointBorderColor: 'rgba(75,220,75,1)',
  96. pointBackgroundColor: '#fff',
  97. pointBorderWidth: 1,
  98. pointHoverRadius: 5,
  99. pointHoverBackgroundColor: 'rgba(75,220,75,1)',
  100. pointHoverBorderColor: 'rgba(220,220,220,1)',
  101. pointHoverBorderWidth: 2,
  102. pointRadius: 1,
  103. pointHitRadius: 10,
  104. data: [],
  105. spanGaps: false
  106. }
  107. var jitterDataset = {
  108. label: 'Jitter',
  109. fill: false,
  110. lineTension: 0.1,
  111. backgroundColor: 'rgba(220,75,75,0.4)',
  112. borderColor: 'rgba(220,75,75,1)',
  113. borderCapStyle: 'butt',
  114. borderDash: [],
  115. borderDashOffset: 0.0,
  116. borderJoinStyle: 'miter',
  117. pointBorderColor: 'rgba(220,75,75,1)',
  118. pointBackgroundColor: '#fff',
  119. pointBorderWidth: 1,
  120. pointHoverRadius: 5,
  121. pointHoverBackgroundColor: 'rgba(220,75,75,1)',
  122. pointHoverBorderColor: 'rgba(220,220,220,1)',
  123. pointHoverBorderWidth: 2,
  124. pointRadius: 1,
  125. pointHitRadius: 10,
  126. data: [],
  127. spanGaps: false
  128. }
  129. var chart1Options = {
  130. type: 'line',
  131. data: {
  132. datasets: [dlDataset, ulDataset]
  133. },
  134. options: {
  135. responsive: true,
  136. legend: {
  137. position: 'bottom'
  138. },
  139. scales: {
  140. xAxes: [{
  141. display: true,
  142. scaleLabel: {
  143. display: false
  144. },
  145. ticks: {
  146. beginAtZero: true
  147. }
  148. }],
  149. yAxes: [{
  150. display: true,
  151. scaleLabel: 'Speed',
  152. ticks: {
  153. beginAtZero: true
  154. }
  155. }]
  156. }
  157. }
  158. }
  159. var chart2Options = {
  160. type: 'line',
  161. data: {
  162. datasets: [pingDataset, jitterDataset]
  163. },
  164. options: {
  165. responsive: true,
  166. legend: {
  167. position: 'bottom'
  168. },
  169. scales: {
  170. xAxes: [{
  171. display: true,
  172. scaleLabel: {
  173. display: false
  174. },
  175. ticks: {
  176. beginAtZero: true
  177. }
  178. }],
  179. yAxes: [{
  180. display: true,
  181. scaleLabel: 'Latency',
  182. ticks: {
  183. beginAtZero: true
  184. }
  185. }]
  186. }
  187. }
  188. }
  189. var chart1 = new Chart(chart1ctx, chart1Options)
  190. var chart2 = new Chart(chart2ctx, chart2Options)
  191. document.getElementById('startBtn').style.display = 'none'
  192. document.getElementById('testArea').style.display = ''
  193. document.getElementById('abortBtn').style.display = ''
  194. w = new Worker('speedtest_worker.min.js')
  195. var interval = setInterval(function () { w.postMessage('status') }, 100)
  196. w.onmessage = function (event) {
  197. var data = JSON.parse(event.data)
  198. var status = data.testState
  199. if (status >= 4) {
  200. clearInterval(interval)
  201. document.getElementById('abortBtn').style.display = 'none'
  202. document.getElementById('startBtn').style.display = ''
  203. w = null
  204. }
  205. if (status === 5) {
  206. document.getElementById('testArea').style.display = 'none'
  207. }
  208. if (status === 1 && Number(data.dlStatus) > 0) {
  209. chart1.data.datasets[0].data[~~(20*Number(data.dlProgress))]=(Number(data.dlStatus))
  210. chart1.data.labels[chart1.data.datasets[0].data.length - 1] = ''
  211. chart1.update()
  212. }
  213. if (status === 3 && Number(data.ulStatus) > 0) {
  214. chart1.data.datasets[1].data[~~(20*Number(data.ulProgress))]=(Number(data.ulStatus))
  215. chart1.data.labels[chart1.data.datasets[1].data.length - 1] = ''
  216. chart1.update()
  217. }
  218. if (status === 2 && Number(data.pingStatus) > 0) {
  219. chart2.data.datasets[0].data.push(Number(data.pingStatus))
  220. chart2.data.datasets[1].data.push(Number(data.jitterStatus))
  221. chart2.data.labels[chart2.data.datasets[0].data.length - 1] = ''
  222. chart2.data.labels[chart2.data.datasets[1].data.length - 1] = ''
  223. chart2.update()
  224. }
  225. ip.textContent = data.clientIp
  226. }
  227. w.postMessage('start')
  228. }
  229. function abortTest() {
  230. if (w) w.postMessage('abort')
  231. }
  232. </script>
  233. </head>
  234. <body>
  235. <h1>HTML Speedtest - Chart.js example</h1>
  236. <div id="testArea" style="display:none">
  237. <p id="ip">Please wait...</p>
  238. <h2>Speed</h2>
  239. <canvas id="chart1Area"></canvas>
  240. <h2>Latency</h2>
  241. <canvas id="chart2Area"></canvas>
  242. <br/>
  243. <a href="javascript:abortTest()" id="abortBtn">Abort</a>
  244. </div>
  245. <a href="javascript:runTest()" id="startBtn">Run speedtest</a>
  246. <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>
  247. </body>
  248. </html>