example5.html 9.1 KB

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