博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20、任务十七——页面交互功能、柱状图的实现
阅读量:4615 次
发布时间:2019-06-09

本文共 4277 字,大约阅读时间需要 14 分钟。

0、题目

  • 参考以下示例代码,原始数据包含几个城市的空气质量指数数据
  • 用户可以选择查看不同的时间粒度,以选择要查看的空气质量指数是以天为粒度还是以周或月为粒度
    • 天:显示每天的空气质量指数
    • 周:以自然周(周一到周日)为粒度,统计一周7天的平均数为这一周的空气质量数值,如果数据中缺少一个自然周的几天,则按剩余天进行计算
    • 月:以自然月为粒度,统一一个月所有天的平均数为这一个月的空气质量数值
  • 用户可以通过select切换城市
  • 通过在"aqi-chart-wrap"里添加DOM,来模拟一个柱状图图表,横轴是时间,纵轴是空气质量指数,。天、周、月的数据只根据用户的选择显示一种。
    • 天:每天的数据是一个很细的矩形
    • 周:每周的数据是一个矩形
    • 月:每周的数据是一个很粗的矩形
  • 鼠标移动到柱状图的某个柱子时,用title属性提示这个柱子的具体日期和数

1、解答过程

task17.html

1  2  3    4     
5 IFE JavaScript Task 17 6 22 23 24
25
请选择日期粒度:26
27
28
29
30  
31
请选择查看的城市:32
34
35  
  // 柱状图显示区36 37
38 39 40

task17.js

1 /* 数据格式演示  2 var aqiSourceData = {  3   "北京": {  4     "2016-01-01": 10,  5     "2016-01-02": 10,  6     "2016-01-03": 10,  7     "2016-01-04": 10  8   }  9 }; 10 */ 11 // 以下两个函数用于随机模拟生成测试数据 12 function getDateStr(dat) { 13   var y = dat.getFullYear();    //返回表示当前年份的四位数字 14   var m = dat.getMonth() + 1;   //getMonth()返回0-11的数来表示当前月份 15   m = m < 10 ? '0' + m : m; 16   var d = dat.getDate();         //返回月份中的某一天,1-31之间的数 17   d = d < 10 ? '0' + d : d; 18   return y + '-' + m + '-' + d; 19 } 20 function randomBuildData(seed) { 21   var returnData = {}; 22   var dat = new Date("2016-01-01"); 23   var datStr = ''; 24   for (var i = 1; i < 92; i++) { 25     datStr = getDateStr(dat); 26     returnData[datStr] = Math.ceil(Math.random() * seed);   //得到与每天相对应的随机空气质量指数数据 27     dat.setDate(dat.getDate() + 1); 28   } 29   return returnData; 30 } 31  32 var aqiSourceData = { 33   "北京": randomBuildData(500), 34   "上海": randomBuildData(300), 35   "广州": randomBuildData(200), 36   "深圳": randomBuildData(100), 37   "成都": randomBuildData(300), 38   "西安": randomBuildData(500), 39   "福州": randomBuildData(100), 40   "厦门": randomBuildData(100), 41   "沈阳": randomBuildData(500) 42 }; 43 // 用于渲染图表的数据 44 var chartData = {}; 45 // 记录当前页面的表单选项 46 var pageState= { 47   nowSelectCity: "北京", 48   nowGraTime: "day", 49   width:20 50 } 51 var aqiChartWrap=document.getElementById("aqi-chart-wrap"), 52     formGraTime=document.getElementById("form-gra-time"), 53     citySelect=document.getElementById("city-select"); 54 /*  55 渲染图表  56  */ 57 function renderChart() { 58   var content=" "; 59   for(var item in chartData){ 60     var bg="#" + Math.random().toString(16).substring(2, 8);   //得到背景的随机颜色 61     content+='
'+ 62 '
'; 63 } 64 aqiChartWrap.innerHTML=content; 65 } 66 /** 67 * 初始化日、周、月的radio事件,当点击时,调用函数graTimeChange 68 */ 69 function initGraTimeForm() { 70 formGraTime.addEventListener("click",graTimeChange); 71 } 72 /** 73 * 日、周、月的radio事件点击时的处理函数 74 */ 75 function graTimeChange() { 76 // 确定是否选项发生了变化 77 var input=document.getElementsByTagName("input"); 78 for(var i=0;i
'+city+''; 93 } 94 citySelect.innerHTML=content; 95 // 给select设置事件,当选项发生变化时调用函数citySelectChange 96 citySelect.addEventListener("change",citySelectChange); 97 } 98 /** 99 * select发生变化时的处理函数100 */101 function citySelectChange() {102 var options=document.getElementsByTagName("option");103 for(var i=0;i

2、遇到的问题

(1)title属性:

  title 属性规定关于元素的额外信息。

  这些信息通常会在鼠标移到元素上时显示一段工具提示文本(tooltip text)。

(2)onchange事件在数据变化时才会发生

  为了得到用户选择查看的城市并处理对应数据,给select设置事件,当选项发生变化时调用函数citySelectChange,修改pageState.nowSelectCity(记录当前页面表单的城市选项)的值,由于题目中给的pageState.nowSelectCity:-1;与后续的数据处理函数没有绑定,所以页面被打开时并不会渲染柱状图,又因为这里用到onchange事件监听选项变化,而onchange事件必须在数据有变化的时候才会发生,所以一开始默认选择的是北京,接着再点北京是不会触发事件的,必须先点其他城市,再点回北京才会出现柱状图,这里有两种方法避免这种情况:

  A、将pageState.nowSelectCity 最初默认值设置为“北京”,这样页面打开时就会呈现北京市的柱状图,之后选择其他的城市,onchange事件就会发生。

  B、在北京前面加一个option,选项名可以为“城市名”,之后用户无论选择什么城市,都会触发事件渲染图表;

  支持onchange事件的 HTML 标签:

  <input type="text">, <select>, <textarea>

  支持onchange事件的 JavaScript 对象:

   select, text, textarea,fileUpload(控件显示一个文本框控件和一个浏览按钮,使用户可以选择客户端上的文件并将它上载到 Web 服务器。)

(3)自然周/月

  题目中要求用户选择 “周” 时要以自然周(周一到周日)为粒度,开始做的方法是从第一个数据开始,每7个数据求一个平均数,后来发现第一个数据也就是2016-01-01并不一定是一周的第一天,所以这种方法行不通。具体可行的方法如下:

  将所有的日期放在一个新的Date对象中,之后利用getDay()方法,该方法返回值是 0(周日) 到 6(周六) 之间的一个整数,所以当new Date.getDay()=6时就意味着一个自然周结束了,所以将每次new Date.getDay()=6之前的<=7个数据求平均即可,同时只要最后的求和!=0就说明最后一组不到7个数据,也应该求平均值。

  “月”要以自然月为粒度做法和上面类似,利用getMonth()方法,该方法返回值是 0(一月) 到 11(十二月) 之间的一个整数。

 

转载于:https://www.cnblogs.com/cjlalala/p/5837976.html

你可能感兴趣的文章
JS线程Web worker
查看>>
Navicat 批处理 自动备份数据库
查看>>
Flex的动画效果与变换!(三)(完)
查看>>
mysql常见错误码
查看>>
Openresty 与 Tengine
查看>>
使用XV-11激光雷达做hector_slam
查看>>
布局技巧4:使用ViewStub
查看>>
ddt Ui 案例2
查看>>
拿下主机后内网的信息收集
查看>>
LeetCode 876. Middle of the Linked List
查看>>
windows 下 python 让人头痛的编码
查看>>
作业一
查看>>
joj1023
查看>>
动画原理——旋转
查看>>
Finding LCM LightOJ - 1215 (水题)
查看>>
python生成器
查看>>
PowerDesigner Constraint name uniqueness 错误
查看>>
系统子系统_GPRS子系统流程图
查看>>
为什么 NSLog 不支持 Swift 对象(转)
查看>>
Ubuntu 下搭建SVN服务器
查看>>