/* 数据格式演示 var aqiSourceData = { "北京": { "2016-01-01": 10, "2016-01-02": 10, "2016-01-03": 10, "2016-01-04": 10 } }; */ // 以下两个函数用于随机模拟生成测试数据 function getDateStr(dat) { var y = dat.getFullYear(); var m = dat.getMonth() + 1; m = m < 10 ? '0' + m : m; var d = dat.getDate(); d = d < 10 ? '0' + d : d; return y + '-' + m + '-' + d; } function randomBuildData(seed) { var returnData = {}; var dat = new Date("2016-01-01"); var datStr = '' for (var i = 1; i < 92; i++) { datStr = getDateStr(dat); returnData[datStr] = Math.ceil(Math.random() * seed); dat.setDate(dat.getDate() + 1); } return returnData; } var aqiSourceData = { "北京": randomBuildData(500), "上海": randomBuildData(300), "广州": randomBuildData(200), "深圳": randomBuildData(100), "成都": randomBuildData(300), "西安": randomBuildData(500), "福州": randomBuildData(100), "厦门": randomBuildData(100), "沈阳": randomBuildData(500) }; // 用于渲染图表的数据 var chartData = {}; // 记录当前页面的表单选项 var pageState = { nowSelectCity: "北京",//-1,//??? why number? nowGraTime: "day" } /** * 渲染图表 */ function renderChart() { var wrap = document.getElementsByClassName("aqi-chart-wrap")[0]; wrap.innerHTML = ""; var className = pageState.nowGraTime.toLowerCase(); console.log(chartData) var div = null; for(var t in chartData){ var data = chartData[t]; var aqiCondition = ""; if(data > 400){ aqiCondition = "very-serious"; } else if(data > 300){ aqiCondition = "serious"; } else if(data > 200){ aqiCondition = "not-bad"; } else if(data > 100){ aqiCondition = "good"; } else { aqiCondition = "very-good"; } div = document.createElement("div"); div.title = t + ': ' + data; div.className = className + ' ' + aqiCondition; div.style = "height: " + (parseInt(data) * 2) + "px;"; wrap.appendChild(div); } } /** * 日、周、月的radio事件点击时的处理函数 */ function graTimeChange() { var radioInputs = document.getElementById("form-gra-time").getElementsByTagName("input"); for(var i = 0; i < radioInputs.length; i++){ // 确定是否选项发生了变化 // imo: 其实调用本函数的时候利用 change 事件已经判读过了 OAO if(radioInputs[i].checked && radioInputs[i].value !== pageState.nowGraTime){ // 设置对应数据 pageState.nowGraTime = radioInputs[i].value; // 调用图表渲染函数 initAqiChartData(); renderChart(); return true; } } return false; } /** * select发生变化时的处理函数 */ function citySelectChange() { var citySlt = document.getElementById("city-select"); // 确定是否选项发生了变化 // imo: 其实调用本函数的时候利用 change 事件已经判读过了 OAO if(citySlt.value !== pageState.nowSelectCity){ // 设置对应数据 pageState.nowSelectCity = citySlt.value; console.log("pageState.nowSelectCity: "+citySlt.value) // 调用图表渲染函数 initAqiChartData(); renderChart(); return true; } return false; } /** * 初始化日、周、月的radio事件,当点击时,调用函数 graTimeChange */ function initGraTimeForm() { var radioInputs = document.getElementById("form-gra-time").getElementsByTagName("input"); for(var i = 0; i < radioInputs.length; i++){ radioInputs[i].addEventListener("change", function(){ graTimeChange(); console.log("radio changed!"); }, false); } } /** * 初始化城市Select下拉选择框中的选项 */ function initCitySelector() { // 读取 aqiSourceData 中的城市,然后设置 id 为 city-select 的下拉列表中的选项 var citySlt = document.getElementById("city-select"); var cityOpt = null; for(var cityName in aqiSourceData){ cityOpt = document.createElement("option"); cityOpt.innerHTML = cityName; citySlt.appendChild(cityOpt); } // 给select设置事件,当选项发生变化时调用函数citySelectChange citySlt.addEventListener("change", function(){ citySelectChange(); console.log("slt changed!"); }, false); } /** * 初始化图表需要的数据格式 */ function initAqiChartData() { // 将原始的源数据处理成图表需要的数据格式 // 处理好的数据存到 chartData 中 chartData = {}; var cityData = aqiSourceData[pageState.nowSelectCity]; //console.log(cityData) var t = pageState.nowGraTime; function saveAvg(name, dataArr){ if(dataArr.length === 0) return false;// !!! // For the very first piece of data chartData[name] = (dataArr.reduce(function(a, b){ return a + b; }, 0) / dataArr.length).toFixed(2); } if(t.toLowerCase() === "day"){ chartData = cityData; console.log("chartData changing...") } else if(t.toLowerCase() === "week"){ var weekVal = []; var weekName = ""; var day = ""; function getWeekName(day){ var weekName = ""; if(!new Date(day).getDay()){ weekName = "this week's Sun: " + day; } else { weekName = "this week's end: " + day; } return weekName; } for(day in cityData){ weekVal.push(cityData[day]); if(!new Date(day).getDay()){// If meets Sunday,(week here begins with Mon & ends with Sun) weekName = getWeekName(day); saveAvg(weekName, weekVal); weekVal = [];// initialize the week. } } if(weekVal.length > 0){// considering the week has no Sunday weekName = getWeekName(day); saveAvg(weekName, weekVal); } } else if(t.toLowerCase() === "month"){ var monthVal = []; var monthName = ""; var day = ""; //var MONTH = [] function getLastMonthName(day){ var monthName = ""; if(new Date(day).getDate() === 1){ var thisMonth = new Date(day).getMonth(); monthName = new Date(new Date(day).setMonth(thisMonth - 1)) .toDateString().replace(/\w+\s(\w+)\s\d{1,2}\s(\d{4})/, "$2 $1");//.slice(4, 7); } else { monthName = new Date(day).toDateString().replace(/\w+\s(\w+)\s\d{1,2}\s(\d{4})/, "$2 $1");//.slice(4, 7); } return monthName; } for(day in cityData){ if(new Date(day).getDate() === 1){// If meets the first day of a month, monthName = getLastMonthName(day); saveAvg(monthName, monthVal); monthVal = [];// initialize the month. } monthVal.push(cityData[day]); } if(monthVal.length > 0){// last several days in last month monthName = getLastMonthName(day); saveAvg(monthName, monthVal); } } } /** * 初始化函数 */ function init() { initGraTimeForm() initCitySelector(); initAqiChartData(); } //window.onload = function(){ init(); //};
<fieldset id="form-gra-time"> <legend>请选择日期粒度:</legend> <label>日<input name="gra-time" value="day" type="radio" checked="checked"></label> <label>周<input name="gra-time" value="week" type="radio"></label> <label>月<input name="gra-time" value="month" type="radio"></label> </fieldset> <fieldset> <legend>请选择查看的城市:</legend> <select id="city-select"> <!-- <option>北京</option> --> </select> </fieldset> <div class="aqi-chart-wrap"> 请选择选项来生成图表OvO </div>
body { min-width: 800px; } .aqi-chart-wrap { display: -webkit-flex; display: -moz-flex; display: -ms-flex; display: -o-flex; display: flex; /*flex-direction: row; flex-wrap: nowrap;*/ flex-flow: row nowrap; justify-content: space-around; align-items: flex-end; background-color: #ddd; color: #555; text-align: center; } .aqi-chart-wrap div { border: 1px solid #000; border-bottom: none; /*height: 200px;*/ /*background-color: pink;*/ } .aqi-chart-wrap .day { min-width: 5px; max-width: 10px; } .aqi-chart-wrap .week { min-width: 25px; max-width: 30px; } .aqi-chart-wrap .month { min-width: 60px; max-width: 70px; } .aqi-chart-wrap .very-good { background-color: hsla(120, 100%, 80%,1); } .aqi-chart-wrap .good { background-color: hsla(60, 90%, 70%,1); } .aqi-chart-wrap .not-bad { background-color: hsla(40, 80%, 60%,1); } .aqi-chart-wrap .serious { background-color: hsla(20, 70%, 50%,1); } .aqi-chart-wrap .very-serious { background-color: hsla(0, 60%, 40%,1); }