ChartJS滚动速度过快

ig9co6j1  于 2022-11-06  发布在  Chart.js
关注(0)|答案(1)|浏览(236)

我有一个简单的网页,它将某个邮政编码的天气数据加载到chart.js图表中:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"/>
  5. <meta charset="UTF-8" />
  6. <title>Weather Chart</title>
  7. <link rel="icon" href="/logo.png">
  8. <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.8.0/chart.min.js"></script>
  9. <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
  10. <script src="https://cdn.jsdelivr.net/npm/hammerjs@2.0.8"></script>
  11. <script src="https://cdnjs.cloudflare.com/ajax/libs/chartjs-plugin-zoom/1.2.1/chartjs-plugin-zoom.js"></script>
  12. <style>
  13. #myChart {
  14. width: 100%;
  15. max-width: 600px;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div><b>Input Zip Code:</b></div>
  21. <input type="text" id="zipCodeInput">
  22. <br>
  23. <button id="zipCodeSubmit">Ok</button>
  24. <br><br><br>
  25. <div id="cityDisplay"></div>
  26. <div id="currentTime"></div>
  27. <div id="canvasDiv">
  28. <canvas id="weatherChart"></canvas>
  29. </div>
  30. <script>
  31. // Execute a function when the user presses a key on the keyboard
  32. document.getElementById('zipCodeInput').addEventListener("keypress", function(event) {
  33. // If the user presses the "Enter" key on the keyboard
  34. if (event.key == "Enter") {
  35. // Cancel the default action, if needed
  36. event.preventDefault();
  37. // Trigger the button element with a click
  38. document.getElementById("zipCodeSubmit").click();
  39. }
  40. });
  41. function printFancyTime(dateObj) {
  42. return dateObj.toLocaleDateString() + " " + dateObj.toLocaleTimeString();
  43. }
  44. // https://bobbyhadz.com/blog/javascript-get-hours-and-minutes-from-date
  45. function getHour(dateObject) {
  46. return dateObject.toLocaleTimeString('en-US', {
  47. // en-US can be set to 'default' to use user's browser settings
  48. hour: '2-digit',
  49. minute: '2-digit',
  50. });
  51. }
  52. function getUserPosition() {
  53. function showPosition(position) {
  54. var posLat = position.coords.latitude;
  55. var posLng = position.coords.longitude;
  56. var accuracy = position.coords.accuracy;
  57. }
  58. if (navigator.geolocation) {
  59. navigator.geolocation.getCurrentPosition(showPosition);
  60. }
  61. }
  62. var OWMkey = "dbf262da490678e53bec10704ce4032d";
  63. document.getElementById('zipCodeSubmit').addEventListener('click', function() {
  64. var geoUrl = `https://api.openweathermap.org/geo/1.0/zip?zip=${$('#zipCodeInput').val()},US&units=imperial&appid=${OWMkey}`;
  65. $.getJSON(geoUrl, function(data) {
  66. initChart(data.lat, data.lon);
  67. //document.getElementById('cityDisplay').innerHTML = data.name;
  68. var getWDGLocationUrl = `https://api.weather.gov/points/${data.lat},${data.lon}`;
  69. $.getJSON(getWDGLocationUrl, function(data) {
  70. var cityname = data.properties.relativeLocation.properties.city + ", " + data.properties.relativeLocation.properties.state;
  71. document.getElementById('cityDisplay').innerHTML = cityname;
  72. document.getElementById('currentTime').innerHTML = printFancyTime(new Date());
  73. })
  74. })
  75. })
  76. function initChart(lat, lng) {
  77. //document.getElementById('canvasDiv').innerHTML = '<canvas id="myChart"></canvas>';
  78. if (Chart.getChart("weatherChart")) {
  79. Chart.getChart("weatherChart").destroy();
  80. }
  81. var ziplat = lat
  82. var ziplon = lng
  83. var tempArr = [];
  84. var cloudArr = [];
  85. var cloudPercentArr = [];
  86. var tsArr = [];
  87. var dataUrl = `https://api.openweathermap.org/data/2.5/onecall?lat=${ziplat}&lon=${ziplon}&units=imperial&appid=${OWMkey}`;
  88. $.getJSON(dataUrl, function(data) {
  89. console.log(data.hourly[0])
  90. for (var x = 0; x < 20; x++) {
  91. var ts = data.hourly[x].dt;
  92. tsArr.push(getHour(new Date(ts * 1000)));
  93. //console.log(data.hourly[x].temp)
  94. tempArr.push(data.hourly[x].temp);
  95. //console.log(printFancyTime(new Date(ts * 1000)))
  96. cloudArr.push(data.hourly[x].clouds);
  97. cloudPercentArr.push(data.hourly[x].clouds);
  98. }
  99. var minTemp = Math.floor(Math.min(...tempArr) / 10) * 10;
  100. var maxTemp = Math.ceil(Math.max(...tempArr) / 10) * 10;
  101. for (var w = 0; w < cloudArr.length; w++) {
  102. // https://stackoverflow.com/questions/11107227/how-to-get-a-percentage-from-a-range#comment59972657_11107254
  103. cloudArr[w] = ((cloudArr[w] / 100) * (maxTemp - minTemp)) + minTemp
  104. }
  105. var weatherChart = new Chart("weatherChart", {
  106. type: "line",
  107. data: {
  108. labels: tsArr,
  109. datasets: [{
  110. label: "temp",
  111. fill: false,
  112. lineTension: 0,
  113. backgroundColor: "rgba(0, 0, 255, 1.0)",
  114. borderColor: "rgba(0, 0, 255, 0.1)",
  115. data: tempArr
  116. }, {
  117. label: "clouds",
  118. fill: true,
  119. lineTension: 0,
  120. backgroundColor: "rgba(130, 130, 130, 0.2)",
  121. borderColor: "rgba(130, 130, 130, 0.5)",
  122. pointBackgroundColor: 'rgba(130, 130, 130, 1)',
  123. data: cloudArr,
  124. }]
  125. },
  126. options: {
  127. plugins: {
  128. legend: {display: false},
  129. zoom: {
  130. zoom: {
  131. wheel: {
  132. enabled: true,
  133. },
  134. pinch: {
  135. enabled: true
  136. },
  137. mode: 'x',
  138. },
  139. pan: {
  140. enabled: true,
  141. mode: 'x'
  142. },
  143. },
  144. tooltip: {
  145. callbacks: {
  146. label: function(context) {
  147. var label = context.parsed.y || '';
  148. var id = context.dataset.label;
  149. var dataIndex = context.dataIndex;
  150. if (id == 'clouds') {
  151. return `${cloudPercentArr[dataIndex]} %`
  152. } else if (id == 'temp') {
  153. return label += ' F'
  154. }
  155. }
  156. }
  157. }
  158. },
  159. }
  160. });
  161. })
  162. }
  163. </script>
  164. </body>
  165. </html>

正如你所看到的,如果你用两个手指滚动图表,它会非常快。有人知道我可以放慢缩放速度的方法吗?
我已经试过speedsensitivity选项,但是到目前为止它们都不起作用。也许我把它们放在错误的位置了?有人能帮帮我吗?

cyvaqqii

cyvaqqii1#

您可以添加和设置:

  1. zoom: { enabled: true, drag: false, mode: "x", speed: 0.1, sensitivity: 0.01 },

  1. Chart.defaults.global.animation.duration = [ms];

相关问题